2015-06-04 23 views
7

Penso che questo dovrebbe essere abbastanza semplice, ma il mio googling non ha aiutato finora ... Ho bisogno di scrivere su un file esistente in C++, ma non necessariamente alla fine del file.Come scrivere a metà di un file in C++?

So che quando voglio solo aggiungere del testo al mio file, posso passare la bandiera ios:app quando si chiama open sul mio oggetto flusso. Tuttavia, questo solo mi permette di scrivere alla fine del file, ma non nel suo mezzo.

Ho fatto un breve programma per illustrare il 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(); 

} 
+0

È possibile che si desideri utilizzare una libreria di file indicizzata (come [GDBM] (http://www.gnu.org.ua/software/gdbm/)) o [sqlite] (http://sqlite.org/) , o anche un database completo ([PostgreSQL] (http://postgresql.org/), [MongoDB] (http://mongodb.org/) ....) –

+0

Modi standard di modifica dei file: leggi input file, elaborare, scrivere su un nuovo file di output, quando è riuscito, sovrascrivere il file di input con il file di output. Ci sono alternative "più veloci" (come ios :: app), ma non lo sono per ogni situazione. – stefaanv

+5

Non è già stato chiesto qui come un milione di volte? –

risposta

11

Non è possibile inserire nel mezzo del file. Devi copiare il vecchio file in un nuovo file e inserire quello che vuoi nel mezzo durante la copia nel nuovo file.

In caso contrario, se si intende sovrascrivere dati/righe nel file esistente, è possibile utilizzare std::ostream::seekp() per identificare la posizione all'interno del file.

+5

Solo per essere completo : Non puoi _inserire_ nel mezzo di un file, ma puoi _replace_, lo stesso numero di byte, sovrascrivendo. –

+0

per completare ulteriormente, fare riferimento al codice di esempio; http://stackoverflow.com/questions/2393345/how-to-append-text-to-a-text-file-in-c – Anil

+1

in pratica, puoi spostare il puntatore del file ovunque usando la funzione membro seekp() e iniziare la scrittura. Tuttavia, qualsiasi scrittura prima di EOF sostituirà i vecchi dati. – 911