Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

poruszanie się po pliku w trybie odczytu

Ostatnio zmodyfikowano 2019-10-05 21:39
Autor Wiadomość
Bartex321
Temat założony przez niniejszego użytkownika
poruszanie się po pliku w trybie odczytu
» 2019-10-05 17:37:39
Tworzę quiz obiektowo w c++ i wszystko jest dobrze dopóki pytania wczytuje w ten sposób:
C/C++
for( int i = 0; i < ilepyt; i++ )
{
    getline( file, obiekt[ i ].pyt );
    getline( file, obiekt[ i ].a );
    getline( file, obiekt[ i ].b );
    getline( file, obiekt[ i ].c );
    getline( file, obiekt[ i ].d );
    getline( file, obiekt[ i ].pop );
}
jednak jeśli już używam klas to chciałbym to zrobić w ten sposób:
C/C++
void uzupelnij() //to jest wewnątrz klasy
{
    fstream file;
    file.open( "quiz.txt", ios::in );
   
    file.seekg( pozycja, ios::beg );
   
    getline( file, pyt );
    getline( file, a );
    getline( file, b );
    getline( file, c );
    getline( file, d );
    getline( file, pop );
   
    pozycja = file.tellg();
   
    file.close();
}
niestety wynik pierwszego kodu wyglada tak:

Typ zmiennych o nazwie float przechowuje:
A: liczby calkowite
B: napisy
C: liczby zmiennoprzecinkowe
D: pojedyncze znaki
//program czeka na wprowadzenie odpowiedzi

Wstrzymanie wykonania programu na czas 2 sekund uzyskasz instrukcja:
A: Wait(2000)
B: Stop(2000)
C: Delay(2000)
D: Sleep(2000)
natomiast wynik drugiego kodu to:

Typ zmiennych o nazwie float przechowuje:
A: liczby calkowite
B: napisy
C: liczby zmiennoprzecinkowe
D: pojedyncze znaki
//program czeka na wprowadzenie odpowiedzi

 programu na czas 2 sekund uzyskasz instrukcja:
A: Wait(2000)
B: Stop(2000)
C: Delay(2000)
D: Sleep(2000)

kod który wypisuje jest identyczny w obu przypadkach, a zmienna pozycja jest wywoływana tylko dwa razy co jest pokazane powyżej
P-175287
pekfos
» 2019-10-05 17:44:17
C/C++
fstream file;
file.open( "quiz.txt", ios::in );

file.seekg( pozycja, ios::beg );

getline( file, pyt );
getline( file, a );
getline( file, b );
getline( file, c );
getline( file, d );
getline( file, pop );

pozycja = file.tellg();
To zupełnie złe podejście. Powinieneś plik otworzyć raz, jak w wersji nr 1 i przekazywać go do metody uzupelnij(). Więc
C/C++
void uzupelnij( std::ifstream & file )
{
    getline( file, pyt );
    getline( file, a );
    getline( file, b );
    getline( file, c );
    getline( file, d );
    getline( file, pop );
}
P-175288
Bartex321
Temat założony przez niniejszego użytkownika
» 2019-10-05 18:46:26
prawdę mówiąc próbowałem, lecz nie chciało działać, może dlatego, że przekazywałem kopię, a nie oryginał?
W każdym bądź razie teraz działa, lecz z ciekawości, czemu tamten kod nie działał?
Wznawiałem wczytywanie od momentu w którym skończyłem poprzednie, wszystko powinno być w porządku
P-175289
pekfos
» 2019-10-05 21:39:07
Tamto nie działało przez buga w GCC, przez które tellg() zawyża wynik w trybie tekstowym pod Windowsem.
https://stackoverflow.com​/questions/27055771​/using-seekg-in-text-mode
P-175290
« 1 »
  Strona 1 z 1