2015-06-04 12 views
7

Myślę, że to powinno być całkiem proste, ale moje googlowanie nie pomogło do tej pory ... Muszę napisać do istniejącego pliku w C++, ale niekoniecznie na końcu pliku.Jak pisać na środku pliku w C++?

Wiem, że gdy chcę tylko dołączyć tekst do mojego pliku, mogę przekazać flagę ios:app podczas wywoływania open w moim obiekcie strumieniowym. Jednak to tylko pozwala mi pisać na samym końcu pliku, ale nie na jego środku.

Zrobiłem krótki program do zilustrowania problemu:

#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

Możesz chcieć użyć indeksowanej biblioteki plików (np. [GDBM] (http://www.gnu.org.ua/software/gdbm/)) lub [sqlite] (http://sqlite.org/) , lub nawet pełnowartościowa baza danych ([PostgreSQL] (http://postgresql.org/), [MongoDB] (http://mongodb.org/) ....) –

+0

Standardowy sposób zmiany plików: odczyt wejścia plik, proces, zapisz do nowego pliku wyjściowego, po pomyślnym zastąpieniu pliku wejściowego plikiem wyjściowym. Istnieją "szybsze" alternatywy (jak ios :: app), ale nie są one dla każdej sytuacji. – stefaanv

+5

Czy to już nie zostało tu zadane milion razy? –

Odpowiedz

11

nie można włożyć w środku pliku. Musisz skopiować stary plik do nowego pliku i wstawić cokolwiek chcesz w środku podczas kopiowania do nowego pliku.

W przeciwnym razie, jeśli zamierzasz zastąpić dane/linie w istniejącym pliku, możliwe jest użycie std::ostream::seekp() do zidentyfikowania pozycji w pliku.

+5

Po prostu być kompletnym : Nie możesz _insert_ w środku pliku, ale możesz zastąpić _replace_, taką samą liczbę bajtów, przez nadpisanie. –

+0

aby uzupełnić dalej, podaj przykładowy kod; http://stackoverflow.com/questions/2393345/how-to-append-text-to-a-extext-file-in-c – Anil

+1

zasadniczo można przenieść wskaźnik pliku w dowolnym miejscu za pomocą funkcji członkowskiej seekp() i rozpocząć pisanie. Jednak każdy zapis przed EOF zastąpi stare dane. – 911