Wyświetlanie następnej linijki pliku

Wyświetlanie następnej linijki pliku
Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
0

Witam
Mam taki kod:

Kopiuj
 std::fstream plik( "bazy/users.txt", std::ios::in ); //zakładamy, że plik istnieje
std::string dane;
std::string przeznaczenie;
std::string przeznaczeniy;


getline( plik, dane );

przeznaczenie = dane;





int pozycja;


pozycja = strlen( przeznaczenie.c_str() );

plik.seekg( pozycja, std::ios_base::beg );


getline( plik, dane );

przeznaczeniy = dane;

textprintf_ex( pamiec, font, 200, 20, makecol( 255, 255, 128 ), - 1, "wdol: %s", przeznaczeniy.c_str() );

W pliku users.txt znajduje się napis "Kamil9132", w kolejnej linii jest napis "Kamil92". Powinien pojawić się napis "Kamil92", ale zamiast tego jest jedynie puste pole. Dlaczego ten napis się nie pojawia?

mr_jaro
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Grudziądz/Bydgoszcz
  • Postów: 5300
0

Piszesz, że ma to być plik o nazwie "users.txt" tak? No to skoro bazy to folder na dysku to nie "bazy/users.txt", a tak ma to być "bazy\users.txt" ;) W ścieżce na dysku używa się backslasha a nie slasha. A że backslash ma swoja role w C++ więc musimy dać podwójny backslash. Mając napisane "bazy/users.txt" program uważał, że to całe jest nazwa pliku.

mto9
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 380
0

Moim zdaniem to powinno byc wedlug tego wzoru:

Kopiuj
  std::ifstream fin("file.txt");
    char dane[255];

    while(!fin.eof())
    {
        fin.getline(dane,255);
        std::cout<<" Dane: "<<dane<<std::endl;
    }
Kamil9132
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 173
0

@mto9 Tyle że to co podałeś nie rozwiązuje mojego problemu, jeżeli usunę część kodu która przesuwa wskaźnik to wszystko dobrze działa.

  • Rejestracja: dni
  • Ostatnio: dni
0

1 znak ze strumienia tekstowego (bo plik otwierasz w trybie tekstowym) to nie koniecznie 1 bajt (znak nowej linii to 2 bajty na windowsie - para \r\n). Tak więc nie możesz zliczać sczytanych znaków i podawać tą liczbę funkcji seekg która oczekuje pozycji w bajtach. Co najwyżej możesz podać seekg to co zwróci tellg.

W twoim przypadku ustawiłeś wskaźnik zaraz za ostatnim drukowalnym znakiem pierwszej linii, ale jednocześnie przed kończącym ją znakiem nowej linii. Stąd kolejne wywołanie getline wczytało tylko ów znak nowej linii czyli pustą linijkę - stąd pusty napis.

Tak więc jeśli chcesz się cofnąć do pewnego momentu w pliku, cofnij się na pozycję zapamiętaną przy pomocy tellg, np:

Kopiuj
plik >> przeznaczenie; // wczytujesz pierwszą linijkę
streampos pozycja = plik.tellg(); // zapamiętujesz pozycję (uwaga na typ danych - powinno być streampos)
/* ...tu wczytujesz coś jeszcze... */
plik.seekg(pozycja, std::ios_base::beg ); // wracasz na zapamiętaną pozycję

BTW. obiekt "string" zapamiętuje ile posiada znaków więc zamiast zliczać znaki po kolei

Kopiuj
strlen( przeznaczenie.c_str() );

odczytaj ich ilość bezpośrednioprzeznaczenie.length()

Kopiuj
 ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.