2010-02-18 16 views
5

Penso che probabilmente devo usare un oggetto fstream ma non sono sicuro di come. Essenzialmente voglio leggere un file in un buffer di byte, modificarlo, quindi riscrivere questi byte in un file. Quindi ho solo bisogno di sapere come fare l'I/O byte.Leggere e scrivere byte da un file (C++)

+2

Si desidera aprirlo in modalità binaria. – GManNickG

+1

@GManNickG Questo non può essere sottolineato abbastanza. In caso contrario, ti farai sbattere la testa contro il muro per circa un'ora con errori casuali. Ad esempio ... il codice funziona se si inserisce un cout casuale << file_stream.tellg(); 'da qualche parte e non riesce diversamente. – Tibor

risposta

7
#include <fstream> 

ifstream fileBuffer("input file path", ios::in|ios::binary); 
ofstream outputBuffer("output file path", ios::out|ios::binary); 
char input[1024]; 
char output[1024]; 

if (fileBuffer.is_open()) 
{ 
    fileBuffer.seekg(0, ios::beg); 
    fileBuffer.getline(input, 1024); 
} 

// Modify output here. 

outputBuffer.write(output, sizeof(output)); 

outputBuffer.close(); 
fileBuffer.close(); 

Dalla memoria penso che questo sia come va.

+0

di solito li renderei dinamici perché non li inserirò tutti in una sola funzione likfe – Craig

+4

È ancora necessario eliminare m_content dopo averlo utilizzato. C++ non ha garbage collection. Anche 1024 byte dovrebbero adattarsi facilmente allo stack in modo da usare solo 'char m_content [1024];' –

+0

^Sì, non dimenticare che: D. – Craig

0

Durante l'esecuzione di I/O di file, è necessario leggere il file in un ciclo che verifica la fine del file e le condizioni di errore. È possibile utilizzare il codice di cui sopra come questo

while (fileBufferHere.good()) { 
    filebufferHere.getline(m_content, 1024) 
    /* Do your work */ 
} 
1

Se avete a che fare con un file di piccole dimensioni, vi consiglio di leggere l'intero file è più facile. Quindi lavorare con il buffer e scrivere di nuovo l'intero blocco. Questi ti mostrano come leggere il blocco - supponendo di compilare il file di input/output aperto da sopra risposta

// open the file stream 
    ..... 
    // use seek to find the length, the you can create a buffer of that size 
    input.seekg (0, ios::end); 
    int length = input.tellg(); 
    input.seekg (0, ios::beg); 
    buffer = new char [length]; 
    input.read (buffer,length); 

    // do something with the buffer here 
    ............ 
    // write it back out, assuming you now have allocated a new buffer 
    output.write(newBuffer, sizeof(newBuffer)); 
    delete buffer; 
    delete newBuffer; 
    // close the file 
    .......... 
+0

Oppure dovrebbe semplicemente modificare il buffer e scriverlo di nuovo. –

+0

Tutto dipende dal tipo di modifica. Sarebbe più facile se si sostituisse uno a uno di uno o più byte nello stream. Tuttavia, se la modifica aggiunge più byte, può causare un'eccezione di overflow della memoria, che è una trappola comune. –

Problemi correlati