c++ fstream ifstream ofstream

¿Cómo escribir en el medio de un archivo en C++?



fstream ifstream (2)

No puede insertar en el medio del archivo. Debe copiar el archivo antiguo a un nuevo archivo e insertar lo que quiera en el medio durante la copia al nuevo archivo.

De lo contrario, si tiene la intención de sobrescribir datos / líneas en el archivo existente, eso es posible usando std::ostream::seekp() para identificar la posición dentro del archivo.

Creo que esto debería ser bastante simple, pero mi búsqueda en Google no ayudó hasta ahora ... Necesito escribir en un archivo existente en C ++, pero no necesariamente al final del archivo.

Sé que cuando solo quiero agregar texto a mi archivo, puedo pasar el indicador ios:app cuando llamo a open en mi objeto de transmisión. Sin embargo, esto solo me permite escribir hasta el final del archivo, pero no en el medio.

Hice un breve programa para ilustrar el problema:

#include <iostream> #include <fstream> using namespace std; int main () { string path = "../test.csv"; fstream file; file.open(path); // ios::in and ios::out by default const int rows = 100; for (int i = 0; i < rows; i++) { file << i << "/n"; } string line; while (getline(file, line)) { cout << "line: " << line << endl; // here I would like to append more text to certain rows } file.close(); }


Puede escribir hasta el final e intercambiar líneas hasta que termine en la posición correcta. Esto es lo que tuve que hacer. Aquí está el archivo test.txt antes:

12345678 12345678 12345678 12345678 12345678

Aquí hay una muestra de mi programa

#include <iostream> #include <fstream> #include <string> using namespace std; fstream& goToLine(fstream& file, int line){ int charInLine = 10; //number of characters in each line + 2 //this file has 8 characters per line int pos = (line-1)*charInLine; file.seekg(pos); file.seekp(pos); return file; } fstream& swapLines(fstream& file, int firstLine, int secondLine){ string firstStr, secondStr; goToLine(file,firstLine); getline(file,firstStr); goToLine(file,secondLine); getline(file,secondStr); goToLine(file,firstLine); file.write(secondStr.c_str(),8); //Make sure there are 8 chars per line goToLine(file,secondLine); file.write(firstStr.c_str(),8); return file; } int main(){ fstream file; int numLines = 5; //number of lines in the file //open file once to write to the end file.open("test.txt",ios::app); if(file.is_open()){ file<<"someText/n"; //Write your line to the end of the file. file.close(); } //open file again without the ios::app flag file.open("test.txt"); if(file.is_open()){ for(int i=numLines+1;i>3;i--){ //Move someText/n to line 3 swapLines(file,i-1,i); } file.close(); } return 0; }

Aquí está el archivo test.txt después:

12345678 12345678 someText 12345678 12345678 12345678

¡Espero que esto ayude!