Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Czyszczenie zawartości otwartego pliku

Ostatnio zmodyfikowano 2013-05-26 13:14
Autor Wiadomość
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".

C/C++
bool reset_pliku( fstream & plik ) //resetuj konfiguracje sciezek
{
    if( plik )
         plik.close();
   
    plik.open( "config.txt", ios::out | ios::trunc );
    plik << DEFAULT_PATH; //zapisz do pliku nową zawartość
   
    return true;
}

int main()
{
    fstream f_conf( "conf.txt", ios::in );
   
    //pobieranie danych z pliku itd, różne funkcje przekazujące referencję do pliku f_conf
   
    string polecenie;
    cin >> polecenie;
    if( polecenie == "reset" )
    {
        reset_pliku( file_conf );
        cout << "Zrestartuj program.";
        exit( 0 );
    }
    //reszta
}


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?



P-83743
pekfos
» 2013-05-23 21:38:15
Wyczyść flagi błędu przed ponownym otwarciem.
P-83745
mostrom
Temat założony przez niniejszego użytkownika
» 2013-05-23 21:45:43
C/C++
bool reset_pliku( fstream & plik ) //resetuj konfiguracje sciezek
{
    if( plik )
         plik.close();
   
    plik.clear();
    plik.open( "config.txt", ios::out | ios::trunc );
    plik << DEFAULT_PATH; //zapisz do pliku nową zawartość
   
    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:
C/C++
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.
P-83746
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.
P-83750
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 =/
C/C++
bool reset( fstream & plik ) //resetuj konfiguracje sciezek
{
    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.
C/C++
bool reset( fstream & plik ) //resetuj konfiguracje sciezek
{
    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;
}
P-83771
pekfos
» 2013-05-25 16:10:43
Zamień
C/C++
if( plik )
na
C/C++
if( plik.is_open() )
P-83841
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 !
P-83949
« 1 »
  Strona 1 z 1