2010-01-16 11 views
14

Próbuję odczytać dane z pliku tekstowego, wyczyścić je, a następnie napisać do niego, w tej kolejności, używając klasy fstream.Odczytaj z pliku, wyczyść go, napisz do niego

Moje pytanie brzmi: jak wyczyścić plik po przeczytaniu z niego. Wiem, że mogę otworzyć plik i wyczyścić go w tym samym czasie, ale czy jest jakaś funkcja, którą mogę wywołać w strumieniu, aby wyczyścić jej zawartość?

Odpowiedz

15

Powinieneś go otworzyć, wykonać operacje wejściowe, a następnie zamknąć i ponownie otworzyć za pomocą zestawu flag std :: fstream :: trunc.

#include <fstream> 

int main() 
{ 
    std::fstream f; 
    f.open("file", std::fstream::in); 

    // read data 

    f.close(); 
    f.open("file", std::fstream::out | std::fstream::trunc); 

    // write data 

    f.close(); 

    return 0; 
} 
4

Jeśli chcesz być całkowicie bezpieczny w razie wypadku lub innego zdarzenia katastrofalne, należy wykonać zapis do drugiego, tymczasowego pliku. Po zakończeniu usuń pierwszy plik i zmień nazwę pliku tymczasowego na pierwszy. Przejdź do biblioteki Boost Filesystem, aby uzyskać pomoc.

+0

Tak postępuje, nadal istnieje luka między usunięciem a zmianą nazwy. W systemach plików UNIX powinieneś fsync, pomiń usuwanie i po prostu zmień nazwę pliku tymczasowego na pierwszy plik; zostanie atomicznie zastąpiony. W systemie Windows NTFS ma specjalną funkcję ReplaceFile; zamienniki atomowe nie są możliwe do wykonania na innych systemach plików AFAIK. – ephemient