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

Zadanie rozdział 35.

Ostatnio zmodyfikowano 2015-05-04 12:53
Autor Wiadomość
bragon91
Temat założony przez niniejszego użytkownika
Zadanie rozdział 35.
» 2015-05-01 15:02:47
Program ma wypisywać co trzeci znak z pliku i nie wiem dlaczego ale program wypisuje pierwszy znak potem przesuwa pozycje o 3 i wtedy cały czas wyświetla znak z pozycji 4. Co jest źle, bo według mnie powinien działać ale jaki widać się mylę.

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

using namespace std;

int main()
{
    fstream plik;
    char znak;
    plik.open( "F:\\plik4.txt" );
   
    if( !plik.good() )
         cout << "Nie odczytało pliku.";
   
    while( !plik.eof() )
    {
        plik >> znak;
        cout << znak << " ";
        plik.seekg( plik.tellg() + 4 );
       
    }
    return 0;
}
P-131675
ax3lr00d
» 2015-05-02 13:25:55
Musisz sprawdzić, czy plik.seekg nie wychodzi poza zakres pliku.

C/C++
if( !plik.seekg( plik.tellg() + 4 ) ) break;


lub zmodyfikować założenia pętli while

C/C++
while( !plik.eof() && !plik.fail() )
P-131693
bragon91
Temat założony przez niniejszego użytkownika
» 2015-05-02 17:52:56
Wielkie dzięki już prawie działa. Jest jeszcze mały problem z tym, że wyświetla 2 razy ostatni znak, tak jakby skończył się plik ale nie przerwało pętli tylko wykonała się jeszcze raz.
Jest także dziwna rzecz której nie rozumie... Już pokazuje.

Plik wejściowy:
1234567890
63463h46k634hk6hke...

Kod programu:

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

using namespace std;

int main()
{
    fstream plik;
    char znak;
    plik.open( "plik4.txt" );
   
    if( !plik.good() )
         cout << "Nie odczyta³o pliku.";
   
    while( !plik.eof() && !plik.fail() )
    {
        plik.clear();
        cout << plik.tellg() << ", ";
        plik >> znak;
        cout << znak << "\n";
        plik.seekg( plik.tellg() + 2 );
    }
    return 0;
}

Konsola:


Sprawa wygląda tak, że nie rozumiem dlaczego program gubi znaki na początku. Może zadaje głupie pytania ale niezbyt rozumiem ostatnie 2 rozdziały poziomu 4.
P-131701
ax3lr00d
» 2015-05-04 12:53:21
Jeżeli chodzi o ostatni znak, to najprawdopodobniej implemetacja, którą używasz nie ustawia bitu failbit gdy seekg wyjdzie poza plik.
Natomiast na pewno jest on ustawiany w momencie odczytu z pliku.

Modyfikując program w ten sposób, sprawdzamy, czy nie odczytujemy poza plikiem.

C/C++
while( !plik.eof() && plik.good() )
{
    plik >> znak;
    if( plik.fail() ) break;
   
    cout << plik.tellg() << ", ";
    cout << znak << "\n";
    plik.seekg( plik.tellg() + 4 );
}

Z tego co pamiętam (ale mogę się mylić) strumienie standardowo pomijają puste znaki (\n \t spacja). Można zmienić to stosując flagę noskipws
czyli


C/C++
plik >> noskipws >> znak;
P-131745
« 1 »
  Strona 1 z 1