Wyświetlanie następnej linijki pliku

0

Witam
Mam taki kod:

 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?

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.

0

Moim zdaniem to powinno byc wedlug tego wzoru:

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

    while(!fin.eof())
    {
        fin.getline(dane,255);
        std::cout<<" Dane: "<<dane<<std::endl;
    }
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.

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:

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

strlen( przeznaczenie.c_str() );

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

 ;)

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