Ĺadny brzuch
napisałem kawałek kodu który w zamierzeniu zlicza liczbe lini w pliku, następnie pobiera pierwsze dwie linie tegoż pliku. w efekcie nie wczytuje nic :/
Oto kod:
ifstream zrodlo("dane.dat", ios::in); string username, password; //zliczam liczbe lini w pliku dane int LiczbaLini = 0; string line; while(getline(zrodlo, line)) LiczbaLini++; //przy zliczaniu wskaźnik czytania się przesuwa więc ustawiam go od nowa na początek zrodlo.seekg(0, ios::beg); //usuwam flagi ios::eofbit i ios::failbit //(poniewaz w while dochodze do końca pliku i się one ustawiają) zrodlo.clear(); //wczytuje login i hasło getline(zrodlo, username); getline(zrodlo, password);
Zauważyłem, że problem polega na tym że kiedy przy zliczaniu liczby linii dochodzę do końca pliku to ustawiana jest flaga ios::eofbit i ios::failbit dla tegoż strumienia (nic niezwykłego :) ) i mimo że dalej zeruje te flagi i przesuwam wskaźnik czytania to nie mogę nic z tego strumienia odczytać (spróbowałem zamknąć strumień po zliczeniu linii i potem znowu otworzyć, ale to też problemu nie rozwiązuje) :/ ... Jak to naprawić ? Wydawało mi się że wyzerowanie flag (i przesunięcie wskaźnika czytania) usuwa problem.
Niby można zrobić dwa strumienie, jeden do liczenia linii i drugi do wczytywania danych, ale to jest nieestetyczne ;] Więc jeśli ktoś wie w czym tkwi problem lub jak go rozwiązać to proszę o pomoc bo sam nie mam pojęcia jak to rozwiązać :/
Użytkownik OGGY_Lwiatko_89 edytował ten post 26 marzec 2008, 13:04
zmień kolejność wywołań funkcji zrodlo.seekg(0, ios::beg); oraz zrodlo.clear(); //clear musi być pierwsze
możesz sobie kontrolnie wstawić w interesujących miejscach odczyt pozycji wsaznika czyli:
int miejsce = zrodlo.tellg();
u mnie po tej zmianie chodzi
w przypadku kodu z pierwszego posta poprawka faktycznie pomaga, ale z innym strumieniem nadal nie :/
fstream settings; string napis; settings.open("settings.ini", ios::in); if(!settings) { settings.clear(); settings.close(); settings.open("settings.ini", ios::out | ios::trunc); napis = "cos"; settings << napis; settings.close(); } else { getline(settings, napis); settings.close(); }
W przypadku gdy plik nie istnieje niby tworzy plik ale ustawiona jest flaga ios::failbit i nic do niego nie zapisuje :/
Przenieś clear() niżej, pod linijką otwierajaca strumien do zapisu
settings.open("settings.ini", ios::out | ios::trunc); napis = "cos"; settings.clear(); int miejsce = settings.tellp(); cout<<"\nWskaznik: "<<miejsce<<endl; settings<<napis; miejsce = settings.tellp(); settings.close();
tutaj też sprawdziłem pozycje wskaźnika (tym razem do zapisu - tellp(); ) - warto to robić gdy pojawiają sie błędy podczas zapisu/odczytu do/z pliku.
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Oto kod:
ifstream zrodlo("dane.dat", ios::in); string username, password; //zliczam liczbe lini w pliku dane int LiczbaLini = 0; string line; while(getline(zrodlo, line)) LiczbaLini++; //przy zliczaniu wskaźnik czytania się przesuwa więc ustawiam go od nowa na początek zrodlo.seekg(0, ios::beg); //usuwam flagi ios::eofbit i ios::failbit //(poniewaz w while dochodze do końca pliku i się one ustawiają) zrodlo.clear(); //wczytuje login i hasło getline(zrodlo, username); getline(zrodlo, password);
Zauważyłem, że problem polega na tym że kiedy przy zliczaniu liczby linii dochodzę do końca pliku to ustawiana jest flaga ios::eofbit i ios::failbit dla tegoż strumienia (nic niezwykłego :) ) i mimo że dalej zeruje te flagi i przesuwam wskaźnik czytania to nie mogę nic z tego strumienia odczytać (spróbowałem zamknąć strumień po zliczeniu linii i potem znowu otworzyć, ale to też problemu nie rozwiązuje) :/ ... Jak to naprawić ? Wydawało mi się że wyzerowanie flag (i przesunięcie wskaźnika czytania) usuwa problem.
Niby można zrobić dwa strumienie, jeden do liczenia linii i drugi do wczytywania danych, ale to jest nieestetyczne ;] Więc jeśli ktoś wie w czym tkwi problem lub jak go rozwiązać to proszę o pomoc bo sam nie mam pojęcia jak to rozwiązać :/
Użytkownik OGGY_Lwiatko_89 edytował ten post 26 marzec 2008, 13:04
zmień kolejność wywołań funkcji zrodlo.seekg(0, ios::beg); oraz zrodlo.clear(); //clear musi być pierwsze
możesz sobie kontrolnie wstawić w interesujących miejscach odczyt pozycji wsaznika czyli:
int miejsce = zrodlo.tellg();
u mnie po tej zmianie chodzi
w przypadku kodu z pierwszego posta poprawka faktycznie pomaga, ale z innym strumieniem nadal nie :/
fstream settings; string napis; settings.open("settings.ini", ios::in); if(!settings) { settings.clear(); settings.close(); settings.open("settings.ini", ios::out | ios::trunc); napis = "cos"; settings << napis; settings.close(); } else { getline(settings, napis); settings.close(); }
W przypadku gdy plik nie istnieje niby tworzy plik ale ustawiona jest flaga ios::failbit i nic do niego nie zapisuje :/
Przenieś clear() niżej, pod linijką otwierajaca strumien do zapisu
settings.open("settings.ini", ios::out | ios::trunc); napis = "cos"; settings.clear(); int miejsce = settings.tellp(); cout<<"\nWskaznik: "<<miejsce<<endl; settings<<napis; miejsce = settings.tellp(); settings.close();
tutaj też sprawdziłem pozycje wskaźnika (tym razem do zapisu - tellp(); ) - warto to robić gdy pojawiają sie błędy podczas zapisu/odczytu do/z pliku.