Nadpisywanie danych w pliku .txt

0

Staram się napisać kod który nadpisze mi liczbę w pliku licznik.txt, u mnie wygląda to tak:

int licznik;
fstream ile_w_bazie;
ile_w_bazie.open("licznik.txt",ios::in|ios::out);
if(ile_w_bazie.good()==true)
{
    ile_w_bazie>>licznik;
    licznik+=1;
    ile_w_bazie<<licznik;
    ile_w_bazie.close();
}
else{
cout<<"Nie można uzyskac dostepu pliku licznik.txt!";
                 }

Jeżeli chodzi o odczyt to jest ok, ale nie wiem jak nadpisać liczbę zawartą w pliku. Proszę o pomoc.

0

Plik to coś z dostępem szeregowym, owszem można podmienić (nadpisać) fragment pliku ale tylko jeżeli ma taki sam rozmiar, wstawić w środek niczego się nie da.
Więc po wczytaniu liczby 9 i zwiększeniu o 1 wyjdzie 10 a te 10 już nie wstawisz na miejsce 9 o ile chodzi o tryb tekstowy.
Co innego tryb binarny, w trybie binarnym każda liczba int ma rozmiar 4 bajty i już (dla 32-bitowych systemów).
Otwieranie w trybie binarnym: ios::out|ios::binary / ios::in|ios::binary odpowiednio.
zapis / odczyt w trybie binarnym: plik.write((char)&liczba,sizeof(liczba)); plik.read((char)&liczba,sizeof(liczba));
Owszem da się załatwić to samo w trybie tekstowym również ale wtedy zapisywać trzeba tak:
plik<<setw(12)<<liczba; odczytywać jak zwykle.

0

Nie jestem pewien czy dobrze zrozumiałem, bo napisałem tak:

int licznik;
fstream ile_w_bazie;
ile_w_bazie.open("licznik.txt",ios::in|ios::out|ios::binary);
if(ile_w_bazie.good()==true)
{
    ile_w_bazie.read((char*)&licznik,sizeof(licznik));
    licznik+=1;
        ile_w_bazie.write((char*)&licznik,sizeof(licznik));
    ile_w_bazie.close();
}

I zmienna licznik przyjmuje losową wartość, znalazłem przykład w którym licznik był tablicą char'ów ale to też się nie sprawdziło. Co zrobiłem źle?

0

Zapomniałeś cofnąć się przed zapisem, owszem teoretycznie ... (pominę to)

fstream ile_w_bazie;
ile_w_bazie.open("licznik.txt",ios::in|ios::out|ios::binary);
if(ile_w_bazie) // tak wystarczy
  {
   streampos pos=ile_w_bazie.tellg();
   int licznik;
   ile_w_bazie.read((char*)&licznik,sizeof(licznik));
   licznik+=1;
   ile_w_bazie.seekp(pos,ios::beg); // cofamy się
   ile_w_bazie.write((char*)&licznik,sizeof(licznik));
   ile_w_bazie.close();
  }

ile_w_bazie.good() - zwraca true lub false więc sprawdzasz czy zwróciło prawdę:
ile_w_bazie.good()==true - to wyrażenie ma wynik true lub false czy nie powinieneś sprawdzić czy wynik jest true zapisując to tak:
(ile_w_bazie.good()==true)==true - to to wyrażenie ma wynik true lub false czy nie powinieneś sprawdzić czy wynik jest true zapisując to tak:
((ile_w_bazie.good()==true)==true)==true - to to wyrażenie ma wynik true lub false czy nie powinieneś sprawdzić czy wynik jest true zapisując to tak:
....

0

Program nie zmieniał mi nadal wartości w pliku(jest tam tylko 0 i nic więcej), postanowiłem wypisać wartość licznika:

int licznik;
fstream ile_w_bazie;
ile_w_bazie.open("licznik.txt",ios::in|ios::out|ios::binary);
if(ile_w_bazie) // tak wystarczy
{
                    streampos pos=ile_w_bazie.tellg();
                    int licznik;
                    ile_w_bazie.read((char*)&licznik,sizeof(licznik));
                    licznik+=1;
                    cout<<"licznik="<<licznik;
                    Sleep(5000);
                    ile_w_bazie.seekp(pos,ios::beg); // cofamy się
                    ile_w_bazie.write((char*)&licznik,sizeof(licznik));
                    ile_w_bazie.close();
}

Wartość jest ujemna i ponad 800000 więc się nie sprawdziło :(

0
int licznik=0;

Pewnie masz plik tekstowy, który ma na początku jeden bajt z tekstem:
0
a program czyta binarną liczbę, więc odczytując wczytuje tylko jeden bajt, pozostałe trzy bajty to śmiecie które w tym liczniku pozostali.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0