2010-02-18 24 views
5

Creo que probablemente tenga que usar un objeto Fstream pero no estoy seguro de cómo. Básicamente, quiero leer un archivo en un búfer de bytes, modificarlo y luego volver a escribir estos bytes en un archivo. Entonces solo necesito saber cómo hacer Byte I/O.Leer y escribir bytes desde un archivo (C++)

+2

Quiere abrirlo en modo binario. – GManNickG

+1

@GManNickG Esto no se puede estresar lo suficiente. Si no lo haces, te golpearás la cabeza contra la pared durante una hora o más con errores al azar. Por ejemplo ... el código funciona si inserta un '' cout << file_stream.tellg(); 'al azar en cualquier otro lugar y falla de lo contrario. – Tibor

Respuesta

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(); 

De memoria, creo que así es como funciona.

+0

normalmente las haría dinámicas porque no las pondría todas en una función. Likfe – Craig

+4

Aún necesita eliminar m_content después de usar new. C++ no tiene recolección de basura. También 1024 bytes deberían caber en la pila con bastante facilidad así que solo use 'char m_content [1024];' –

+0

^Sí, no olvide que: D. – Craig

0

Mientras se realiza la E/S de archivos, tendrá que leer el archivo en un bucle comprobando el final del archivo y las condiciones de error. Puede usar el código anterior como este

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

Si se trata de un tamaño de archivo pequeño, le recomiendo que leer todo el archivo sea más fácil. Luego trabaje con el buffer y escriba todo el bloque de nuevo. Estos le muestran cómo leer el bloque: suponiendo que completa el archivo de entrada/salida abierto desde la respuesta anterior

// 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

O debería simplemente alterar el buffer y volver a escribirlo. –

+0

Todos dependen del tipo de modificación. Sería más fácil si se trata de reemplazo uno a uno de uno o más bytes en la transmisión. Sin embargo, si la alteración le agrega más bytes, puede causar una excepción de desbordamiento de memoria, que es una trampa común. –

Cuestiones relacionadas