R. 32 - nieudany odczyt pliku przy użyciu pętli for
Ostatnio zmodyfikowano 2019-01-06 21:13
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: 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? |
|
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: 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: for( bool bWczytano =( bool ) std::getline( plik, wiersz ); bWczytano; bWczytano =( bool ) std::getline( plik, wiersz ) )
lub krócej, bez niepotrzebnego powtórzenia: for( bool bWczytano; bWczytano =( bool ) std::getline( plik, wiersz ); )
albo dłużej, używając rzutowania w stylu 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: for(; std::getline( plik, wiersz ); )
|
|
rottingham Temat założony przez niniejszego użytkownika |
» 2019-01-06 21:13:12 Ok, dziękuję bardzo za wyjaśnienie.
Pozdrawiam! |
|
« 1 » |