2010-08-18 18 views
5

¿Es posible actualizar solo una parte de un archivo en C++?Actualizar solo parte de un archivo binario con C++

Ejemplo:

Antiguo Archivo A: 'A''A''A''B''B''C''C''C'
nuevo archivo A: ' A''A''A' 'X''X' 'C''C''C'

que los archivos reales no son tan pequeños como estos ejemplos, y no saben exactamente qué ha cambiado (offset y writeLenght para contenido modificado) sería genial poder abrir un archivo, establecer la transmisión en la posición correcta, escribir la información y cierra el archivo de nuevo ... pero esto dará lugar a un archivo que se ve así:

Archivo actualizado: '0''0''0''X''X''C''C' ' C'

este es el código que utilicé:

void update file(list<unsigned char> content, int offset){ 

fs::basic_ofstream<char> fileStream(path , ios::out | ios::binary);  
list< unsigned char >::const_iterator contentIter = content.begin(); 
// begin write operation at the offset 
advance(contentIter , offset); 
fileStream.seekp(offset); 
while(contentIter != content.end()){ 
    unsigned char value = (char)*contentIter; 
    fileStream.put(value); 
    ++contentIter;   
} 
fileStream.close(); 

¿hay una manera de hacer esto, o tiene todo el archivo que reescribirse cada vez que se cambia?

Gracias

Respuesta

3

Ok mapeado, gracias:
Aquí es una pieza de trabajo de código en caso de que alguien se encuentra con la misma pregunta.

void update file(list<unsigned char> content, int offset, int writeLength){ 

fs::basic_fstream<char> fileStream(path , ios::out | ios::in | ios::binary);  
list< unsigned char >::const_iterator contentIter = content.begin(); 
// begin write operation at the offset 
advance(contentIter , offset); 
// set the Stream to the offset position 
fileStream.seekp(offset); 
while(contentIter != content.end() && writeLength != 0){ 
    unsigned char value = (char)*contentIter; 
    fileStream.put(value); 
    ++contentIter; 
    --writeLength;   
} 
fileStream.close(); 
} 

Uno debe comprobar si hay errores o decirle a la corriente a lanzar excepciones cuando se utiliza este código ....

7

Tiene bastante la idea correcta. Lo principal que necesita cambiar es usar un fstream en lugar de ofstream, y usar ios::in | ios::out cuando lo abra (suponiendo que fs::basic_ofstream se resuelve de alguna manera como std::basic_ofstream). Cuando abre con solo ios::out, se destruye el contenido del archivo existente.

Editar: Por cierto, me cuesta imaginar una situación en la que usar std::list<char> sea una buena idea. En una máquina típica con punteros de 32 bits y char s de 8 bits, está considerando utilizar 8 veces más espacio para los punteros que para los datos que intenta almacenar, y su acceso a los datos que la tienda en general también es bastante lenta.

+0

Gracias por su respuesta. Eso es exactamente lo que estaba buscando. En cuanto a los caracteres: estoy escribiendo un programa de prueba de estrés para tarjetas de memoria flash. Tengo que ser capaz de generar patrones donde cada byte tiene un valor definido. Estos patrones se almacenan internamente y se escriben en un archivo. De vez en cuando los leo de vuelta y los comparo con los patrones almacenados. Entonces puedo decir la posición exacta del error y verificar si es reproducible. – zitroneneis

3
No

como C++ 'ish, pero la manera obvia de hacerlo es con la memoria archivos

Cuestiones relacionadas