2010-03-27 21 views
7

Quiero hacer modificaciones en el medio de un archivo de texto usando C++, sin alterar el resto del archivo. ¿Cómo puedo hacer eso?Cómo sobrescribir solo parte de un archivo en C++

+2

Esto no es un duplicado. La publicación anterior solo trataba sobre cómo leer un registro, se trata de escribir en un archivo. Necesita leer más detenidamente. – neuromancer

+1

Su elaboración de que el reemplazo es de la misma longitud hace que la carne de la pregunta sobre cómo reposicionar el puntero al archivo, que es exactamente lo que proporcionaron las respuestas a su otra pregunta. –

Respuesta

8

Si la cadena de reemplazo tiene la misma longitud, puede realizar el cambio en su lugar. Si la cadena de reemplazo es más corta, es posible que pueda rellenarla con espacios de ancho cero o similares para convertirla en la misma cantidad de bytes y realizar el cambio en su lugar. Si la cadena de reemplazo es más larga, simplemente no hay espacio suficiente a menos que mueva primero todos los datos restantes.

+0

Eso suena bien, pero ¿cuál es el código para eso? Supongamos que la cadena tiene la misma longitud. – neuromancer

+3

Bueno, depende de qué biblioteca de E/S esté utilizando, la biblioteca estándar de C, la biblioteca estándar de C++ o una API específica del sistema operativo. Pero generalmente hay tres pasos. Al abrir el archivo, especifique el acceso de escritura sin truncamiento, p. fopen (fname, "r +"). Busque en la ubicación deseada, p. Fseek. Escriba la nueva cadena con, por ejemplo, fwrite o fprintf. En algunas API, como Windows OVERLAPPED o linux aio, puede decir "escribir en esta ubicación" sin un paso de búsqueda por separado. –

+0

fseek no funciona con ofstream. ¿Cómo se puede hacer con ofstream? – neuromancer

0

Generalmente, abra el archivo para leer en modo texto, lea línea tras línea hasta el lugar que desea cambiar, mientras lee las líneas, escríbalas en un segundo archivo de texto que abrió para escribir. En el lugar del cambio, escriba en el segundo archivo los datos nuevos. Luego continúe la lectura/escritura del archivo hasta su final.

+1

Quiero evitar hacerlo de esta manera. – neuromancer

12

Use std :: fstream.

El std :: ofstream más simple no funcionaría. Truncaría su archivo (a menos que use la opción std :: ios_base :: app, que de todos modos no es lo que quiere).

std::fstream s(my_file_path); // use option std::ios_base::binary if necessary 
s.seekp(position_of_data_to_overwrite, std::ios_base::beg); 
s.write(my_data, size_of_data_to_overwrite); 
+0

Si usa el indicador 'std :: ios_base :: binary', no olvide que lo necesitará o esto con' std :: ios_base :: out' – qbert220

+0

Usando 'std :: ios_base :: binary | Los indicadores del modo std :: ios_base :: out' provocan el truncamiento después de los datos escritos en el archivo. Usando 'std :: ios_base :: binary | std :: ios_base :: out | std :: ios_base :: in' previene esto. – qbert220

+0

Entonces, ¿** tengo ** para abrir el archivo para leer y escribir para modificar parte del archivo, incluso si en realidad * nunca * leí? ¿Es posible modificar (no agregar) el acceso de escritura ** solo ** sin sobreescribirlo todo? Quizás fseek en sí mismo requiere que el archivo esté abierto para la lectura, incluso si no se usa fread? (Aunque esto me parece extraño) Finalmente, ¿esto es una limitación del sistema operativo, o simplemente cómo funciona la biblioteca estándar de C++? – Dexter

Cuestiones relacionadas