Salve, ho iniziato da un po' a studiare c++, e volevo creare un programma che converte un file di testo a binario. Ho provato a usare la libreria fstream che permette di aprire un file in codice binario, vorrei sapere se fosse possibile stampare quel codice. Grazie in anticipo
La rappresentazione binaria di un file di testo e' gia' praticamente il file di testo (a meno dei caratteri di controllo).
Cio' che vorresti fare tu (se non ho capito male) e' la stampa del codice ASCII del singolo carattere ed in questo caso c'entra "poco" come viene aperto lo stream.
Nell'immagine d'esempio, a DX c'e' il file di testo in formato "binario": come vedi e' identico, con la sola differenza che i caratteri di controllo (andata a capo) non hanno effetto, ma vengono rappresentati col proprio valore "numerico" (ASCII), mentre a SX c'e' la conversione del codice ASCII relativo (in esadecimale, in questo caso)
Nella rappresentazione testuale, puoi semplicemente stampare il "buffer" acquisito, cosi' com'e', basta semplicemente:
C++:
// in C++
std::cout << buffer ;
// oppure
for(int i=0; i<len_buffer; i++)
std::cout << buffer[i];
Per la rappresentazione del codice ASCII del singolo carattere, devi scorrere il buffer, e per ogni carattere, stampare il suo valore esadecimale corrispondente (o decimale, o ottale, o binario... insomma cio' che vuoi)
C++:
for(int i=0; i<len_buffer; i++)
std::cout << std::hex << std::uppercase << buffer[i] << ' ';
//stampa codice esadecimale del carattere... e lascia uno spazio per distanziare il successivo
A questo punto dirai, a che serve aprire lo stream in modalita' testo o in modalita' binaria?
Serve se vuoi avvalerti, per esempio, dei caratteri di controllo.
i file di testo sono file contenenti sequenze di righe di testo. A seconda dell'ambiente in cui viene eseguita l'applicazione, è possibile che si verifichi una conversione di caratteri speciali nelle operazioni di input/output per adattarle a un formato specifico del sistema.
Per esempio "andare a capo" che in MSDOS/Windows e' CR-LF (CarriageReturn-LineFeed = RitornoDiCarrello-AvanzamentoRiga = \r\n), in Unix/Linux invece e' solo LF (\n)
L'utilizzo della modalità appropriata migliora la portabilità.
Basta cercare su stackoverflow e trovi già tutto :)
https://stackoverflow.com/questions/5016262/need-to-convert-txt-file-into-binary-file-in-c
Tra l'altro, ti dicono anche che è sconsigliato farlo.
Cio' che sconsigliano, in quell'esempio, e' la conversione dei
numeri da formato testo, a formato binario, per un discorso di portabilita' e che riguarda il ben noto problema della disposizione big-endian / little-endian nelle diverse architetture.