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

R. 32 - nieudany odczyt pliku przy użyciu pętli for

Ostatnio zmodyfikowano 2019-01-06 21:13
Autor Wiadomość
rottingham
Temat założony przez niniejszego użytkownika
R. 32 - nieudany odczyt pliku przy użyciu pętli for
» 2019-01-06 16:39:47
Cześć!

Mam problem. Próbuję odczytać plik przy pomocy pętli for. Wklejam kod z lekcji:
C/C++
std::string wiersz;
for( bool bWczytano = std::getline( plik, wiersz ); bWczytano; bWczytano = std::getline( plik, wiersz ) )
     std::cout << wiersz << std::endl;


No i... wyskakuje mi w kompilatorze błąd:
|15|error: cannot convert ‘std::basic_istream<char>’ to ‘bool’ in initialization|
|15|error: cannot convert ‘std::basic_istream<char>’ to ‘bool’ in assignment|

czy ma ktoś pomysł co robię źle w tej sytuacji, w której pozornie nie mogę nic zrobić źle?

EDIT.
Kod nie działa na Ubuntu natomiast działa na Windowsie.
Nie wiecie jak naprawić ten błąd na Ubuntu 16.04?
P-173438
pekfos
» 2019-01-06 17:59:48
Od C++11 konwersja strumieni do bool jest wyłącznie jawna, więc nie można po prostu przypisać strumienia do zmiennej typu bool. Wciąż można użyć strumienia w kontekście wymagającym bool, więc pętla powinna wyglądać tak:
C/C++
while( std::getline( plik, wiersz ) )
Nie wiem czemu ta pętla for była w ogóle tak zapisana, bo cały jej sens to wprowadzenie zmiennej bWczytano, która jest widoczna tylko w pętli i zawsze równa true. Co ciekawe, w dalszym przykładzie była już użyta taka pętla while ;)

Poprawiłem kod w lekcji.

//edit:
Na wypadek jakbyś się zastanawiał, jak powinno to wyglądać gdyby poprawić pętlę for tak, jak była, to:
C/C++
for( bool bWczytano =( bool ) std::getline( plik, wiersz ); bWczytano; bWczytano =( bool ) std::getline( plik, wiersz ) )
lub krócej, bez niepotrzebnego powtórzenia:
C/C++
for( bool bWczytano; bWczytano =( bool ) std::getline( plik, wiersz ); )
albo dłużej, używając rzutowania w stylu C++ ;)
C/C++
for( bool bWczytano = static_cast < bool >( std::getline( plik, wiersz ) ); bWczytano; bWczytano = static_cast < bool >( std::getline( plik, wiersz ) ) )
tylko jak wcześniej wspomniałem, zmienna bWczytano nie ma tu sensu, więc można ją wywalić i sprowadzić to do, w gruncie rzeczy, pętli while:
C/C++
for(; std::getline( plik, wiersz ); )
P-173439
rottingham
Temat założony przez niniejszego użytkownika
» 2019-01-06 21:13:12
Ok, dziękuję bardzo za wyjaśnienie.

Pozdrawiam!
P-173443
« 1 »
  Strona 1 z 1