mostrom Temat założony przez niniejszego użytkownika |
[C++] Czyszczenie zawartości otwartego pliku » 2013-05-23 21:25:45 Witam! Chyba temat dość jasno wyjaśnia mój problem :D Pracuję na pewnym pliku, i chciałbym, aby program ustawiał domyślną zawartość tego pliku, jeżeli użytkownik wpisze w konsoli "reset". bool reset_pliku( fstream & plik ) { if( plik ) plik.close(); plik.open( "config.txt", ios::out | ios::trunc ); plik << DEFAULT_PATH; return true; }
int main() { fstream f_conf( "conf.txt", ios::in ); string polecenie; cin >> polecenie; if( polecenie == "reset" ) { reset_pliku( file_conf ); cout << "Zrestartuj program."; exit( 0 ); } }
Nie wiem czemu, ale jakkolwiek zmieniałbym funkcję reset_pliku(fstream&), kiedy wpiszę "reset" program tylko zeruje plik. Nigdy nie zapisuje się domyślna wartość. Małe wtrącenie.. Na maturze z informatyki w tym roku, także była operacja na plikach, i chciałem się popisać przekazywaniem argumentu przez referencję, jednak program nie działał dobrze, jeśli było takich funkcji więcej niż jedna.. Nie wiem czy to ma związek z tymi referencjami czy nie, ale może coś jest na rzeczy? |
|
pekfos |
» 2013-05-23 21:38:15 Wyczyść flagi błędu przed ponownym otwarciem. |
|
mostrom Temat założony przez niniejszego użytkownika |
» 2013-05-23 21:45:43 bool reset_pliku( fstream & plik ) { if( plik ) plik.close(); plik.clear(); plik.open( "config.txt", ios::out | ios::trunc ); plik << DEFAULT_PATH; return true; }
Wciąż ten sam efekt.. Nie wiem co jest na rzeczy, może za często zamykam i otwieram ten sam plik EDIT: Przeciążyłem tę funkcję, tak aby obejść problem na około: bool reset_pliku( const string nazwa_pliku ) { fstream plik( nazwa_pliku.c_str(), ios::out | ios::trunc ); plik << DEFAULT_PATH; plik.close(); return true; }
Działa :) Jednak nie jestem zadowolony z takiego rozwiązania, trochę podcina ręce. Temat wciąż otwarty, i nadal sobie nie poradziłem z obiektem fstream. |
|
ison |
» 2013-05-23 22:28:05 To dlatego, że fstream nie gwarantuje zapisu do pliku w czasie rzeczywistym wszystkiego co wrzucasz mu do bufora. Użyj flush po zapisie. Możesz też zamknąć plik, wtedy uzyskasz ten sam efekt (tylko będziesz miał zamknięty plik ;p). No i warto by sprawdzać czy w ogóle udało się otworzyć plik. |
|
mostrom Temat założony przez niniejszego użytkownika |
» 2013-05-24 14:23:48 No i warto by sprawdzać czy w ogóle udało się otworzyć plik. |
No właśnie teraz sprawdzam i okazuje się że nie udaje się otworzyć pliku =/ bool reset( fstream & plik ) { if( plik ) plik.close(); plik.open( "config.txt", ios::out | ios::trunc ); if( !plik ) return false; plik << DEFAULT_PATH; plik.flush(); return true; } Za każdym razem ta funkcja zwraca false. Jeśli dodam clear() tuż po otwarciu pliku, to funkcja zwróci true, jednak cały czas tylko kasuje zawartość pliku, a nic nie zapisuje. bool reset( fstream & plik ) { if( plik ) plik.close(); plik.open( "config.txt", ios::out | ios::trunc ); plik.clear(); if( !plik ) return false; plik << DEFAULT_PATH; plik.flush(); return true; } |
|
pekfos |
» 2013-05-25 16:10:43 |
|
mostrom Temat założony przez niniejszego użytkownika |
» 2013-05-26 13:14:46 Działa, nie spodziewałem się że ta instrukcja mogła nie działać właściwie. Dziękuję za pomoc ! |
|
« 1 » |