Kolejny problem z zapisem i odczytem do pliku.

0

Witam!

mam problem z odczytem z pliku.

Chcę zrobić program odczytujący z pliku hasło, które potem można zmienić.
O ile pierwsza cześć działa bez zarzutu, to z drugą jest spory problem.

Kod programu (maksymalnie okrojony, bo wiem że błąd jest gdzieś w tym miejscu):

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
using namespace std;





int main ()
{  
    

    fstream plik;

plik.open( "pin.txt", ios::in | ios::out);




    string haslo;
    getline( plik, haslo);
    plik.close();
   
    
    string a;
    cout << endl << endl;
    cout << "podaj haslo" << endl;
    cin >> a;
    
    if (a==haslo)

    {

                       cout << "podaj nowe haslo" << endl << endl;

                       
                         fstream plik ( "pin.txt", ios::out  );
                         string nowe;
                         getline( cin, nowe);
                         plik.write ( &nowe[ 0 ], nowe.length() );
                         
                         
                         cout << "nowe haslo wprowadzono pomyslnie" << endl << endl; 
                         plik.close();
                         system ("PAUSE");                      

           
                      // --------------------------

}

return 0;
}


 

Hasło się odczytuje, sprawdza czy jest poprawne - do tej pory wszystko w porządku.
Niestety, nie da się wpisać nowego hasła.
Zauważyłem, jeżeli wpiszę stare hasło (przy sprawdzaniu) a po spacji nowe, to nowe się zapisze w pliku. Ale jest to dla mnie kompletnie niezrozumiałe, bo wygląda jakby instrukcja z wpisywaniem wskakiwała przed cout.

Bardzo proszę o pomoc, bo siedzę nad tym drugi dzień i nie mam pojęcia gdzie jest błąd.
Dodam jeszcze, że jak w kodzie jest sam fragment z wpisywaniem pliku, to działa bez zarzutu.

0

Najpierw wykonuje się cin >> a; - czyli wpisujesz costam\n (\n - bo klepiesz Enter, prawda?). istream::operator>>() wczytuje dane aż do napotkania pierwszego białego znaku - \n jest właśnie białym znakiem. Nie jest on jednak skonsumowany, zostaje w strumieniu.
Następnie wykonuje się getline( cin, nowe); - getline() wczytuje aż do napotkania specjalnego znaku, którym domyślnie jest \n - w strumieniu leży jeszcze \n zostawione przez Ciebie poprzednio, prawda? Więc getline() konsumuje (wczytuje ze strumienia) ten znak i odrzuca go (nie zapisuje do zmiennej nowe) - tym samym kończy swoje działanie a nowe jest pustym stringiem.

Czyli co powinieneś zroibić po cin >> a; a przed getline( cin, nowe);?

0

nareszcie ktoś mi to wytłumaczył!
wyczyściłem strumień i działa bez zarzutu.
dzięki wielkie za pomoc.

mam jeszcze jedno pytanie.
czy można w jednym programie korzystać z kilku plików? bo jak próbuję otworzyć inny plik, to i tak pobiera mi dane z tego samego co wcześniej.

innym rozwiązaniem byłoby pobieranie kilku danych z jednego pliku, ale jak próbuję zmieniać hasło, to usuwają mi się kolejne dane i nie mogę już z nich skorzystać.

i w ogóle miałbym zdecydowanie mniej problemów, gdyby do tego zewnętrznego pliku można było zapisywać dane jako liczby, a nie jako tekst, ale z tego co wiem nie da się. a jeżeli się da to jak ?

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