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

[Lekcja 35] Zadanie 1

Ostatnio zmodyfikowano 2015-04-15 16:59
Autor Wiadomość
Gage
Temat założony przez niniejszego użytkownika
[Lekcja 35] Zadanie 1
» 2015-04-08 19:56:57
Witam!
Dziś mam problem z zadaniem z lekcji 35 o treści: Napisz program, który odczytuje co trzeci znak z pliku. Użyj do tego metod poznanych w niniejszym rozdziale. Przetestuj poprawność działania programu na bardzo krótkim pliku tekstowym, wypisując co trzeci odczytany znak na ekranie.
Mianowicie, z niewiadomej przyczyny, program nie działa tak, jak powinien. Po pierwsze - z tego, co mi się wydawało, zapis plik.seekg(3), oznacza wczytywanie od 4 znaku, a wczytuje od trzeciego. W pętli również wszystko wypisuje w porządku, ale ustawienie to 4 (mimo, że wczytuje co trzeci znak). Pytanie kieruję, mimo tego, że działa, ponieważ chciałbym jednak coś wynieść z tych lekcji z możliwie najmniejszą liczbą niezrozumień. Z tego, co się do tej pory dowiedziałem - kompilator nie liczy znaków białych. Treść pliku to:
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
Celem jest wczytywanie samych trójek. Cel został spełniony, ale nie rozumiem, dlaczego musiałem przy obu seekg dodać 1.
Dzięki za odpowiedzi!

C/C++
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream plik;
    plik.open( "D:/asd.txt" );
    if( !plik.good() )
         return 0;
   
    int b;
    plik.seekg( 3 );
    plik >> b;
    cout << b;
    while( !plik.eof() )
    {
        plik.seekg( plik.tellg() + 4 );
        plik >> b;
        cout << b;
    }
}
P-130419
Gage
Temat założony przez niniejszego użytkownika
» 2015-04-08 20:03:59
Dodatkowo wypisuje o jedną 3 za dużo. Program działa dokładnie tak samo, kiedy usunę linijki:
C/C++
plik.seekg( 3 );
plik >> b;
cout << b;
P-130421
Nitr0Skay
» 2015-04-12 07:40:01
Bo w istocie te linijki nie są potrzebne. W pętli ma pan to:
C/C++
plik.seekg( plik.tellg() + 4 );
plik >> b;
cout << b;

plik.seekg()
 przyjmuje jako argument pozycję ustawienia bufora w pliku równą
plik.tellg()
 powiększoną o 4.

Skoro korzysta Pan z pętli, nie lepiej byłoby skorzystać z modyfikatora, który będzie przesuwał pozycję w metodzie
seekg()
 na początku pętli, a będzie modyfikowany na jej końcu ?? Tak będzie imo wygodniej ;)
P-130627
Gage
Temat założony przez niniejszego użytkownika
» 2015-04-15 16:59:53
Poprawione wygląda w następujący sposób:
C/C++
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    fstream plik;
    plik.open( "D:/asd.txt" );
    if( !plik.good() )
         return 0;
   
    char b;
    int a = plik.tellg();
    while( !plik.eof() )
    {
        plik.seekg( a );
        plik.get( b );
        cout << b;
        a = plik.tellg() + 2;
    }
}
ale zwyczajnie nie jest w stanie odczytać co trzeciego znaku przy żadnej możliwej modyfikacji zmiennej a. Ustawione na +2, wczytuje co czwarty znak.
Czuję się dosyć skonfundowany tym przykładem. Jeśli ktoś rozumie, gdzie popełniam błąd - prosiłbym o odpowiedź. Pozdrawiam!
P-130922
« 1 »
  Strona 1 z 1