Problem z seekg() - dziwnie pobiera znaki

0

Witam,

Mam pętle do odczytu znaków z pliku. Wszystko byłoby ok, ale... Odczytuje 3 razy pierwszy znak każdej następnej linii.

Kod:

if (plik.is_open())
	{
		char znak;
		for(i=0; i<iloscWierszy*iloscZnakow;i++){
			plik.seekg(start);
			plik >> znak;
			start++;
			cout << "Wczytano znak: " << znak << endl;
			pobrane[i] = znak-'0';
			
		}
}

Plik wygląda następująco:

123
456
789

A wynik:

Wczytano znak: 1
Wczytano znak: 2
Wczytano znak: 3
Wczytano znak: 4
Wczytano znak: 4
Wczytano znak: 4
Wczytano znak: 5
Wczytano znak: 6
Wczytano znak: 7

Gdzie popełniam błąd?

1

To zapewne jest Windows więc, plik tekstowy binarnie wygada tak (znak końca linii składa się z dwóch bajtów):
123\r\n456\r\n789\r\n

tymczasem: istream& operator>>(istream&, char &) , domyślnie ignoruje białe znaki takie jak: spacja \t \n \r i dopiero wtedy wczytuje znak.
Teraz wiedząc to co si opisałem, powinieneś dokładnie zrozumieć skąd ten wynik.
Polecam poczytać dokumentację STL-a.

0

Wielkie dzięki! Nie dość, że rozwiązałem problem to jeszcze ułatwiłem kod. :)

0
#include <algorithm>
#include <iterator>
#include <cctype>
#include <vector>
#include <iostream>

std::vector< int > readed;
std::for_each( std::istream_iterator< char >( file ), std::istream_iterator< char >(),
  [&readed](char chr)
  {
    if ( std::isdigit( chr ) ) {
      std::cout << "Wczytano znak: " << chr << "\n";
      readed.push_back( chr - '0' );
    }
  }
);

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