[C++] Rozdzial 34 Zad. 2
Ostatnio zmodyfikowano 2016-09-21 22:25
Dexterowy Temat założony przez niniejszego użytkownika |
[C++] Rozdzial 34 Zad. 2 » 2015-12-30 00:25:36 bool odczyt( string sciezka ) { ifstream plik; plik.open( sciezka.c_str() ); if( !plik.good() ) return false; int i = 0; while( !plik.eof() ) { int suma = 0; bool check = true; i++; while( !czyNapotkanoZnakNowegoWiersza( plik ) || plik.eof() ) { int liczba; char znak; plik >> liczba; if( plik.fail() ) { plik.clear(); plik >> znak; check = false; } else { suma += liczba; } } if( check == false ) cout << "Bledne dane w wierszu nr " << i << endl; else cout << suma << endl; } return true; }
Siemanko. Problem z tą funkcją mam taki, że działa jak należy jednak na ostatniej linijce w pliku się zapętla, niestety nie wiem czemu... plik do odczytu: 1 2 3 3 4 a 5 3 2 5 2 2 1 3 # 3 4 |
|
ninjadam |
» 2015-12-30 16:47:42 W drugiej pętli while brakuje negacji przy plik.eof() |
|
Dexterowy Temat założony przez niniejszego użytkownika |
Nope. » 2015-12-30 17:50:10 Niestety, nic to nie daje a nawet nie wczytuje nawet tych 4 linii, zapętla się na samym początku. :/ |
|
BykWojtek |
Chyba to ma być tak » 2015-12-31 12:56:36 Jak wyżej ktoś pisał brakuje negacji plik.eof() i w tej samej linijce zamiast znaku '||' musi być znak '&&'. |
|
jundymek |
» 2016-08-22 15:18:07 Co może być przyczyną, że otrzymuję wynik w takiej formie?: 0x6afdc00x6afdc00x6afdc06 0x6afdc00x6afdc00x6afdc00x6afdc0Bledne dane w wierszu: 2 0x6afdc00x6afdc05 0x6afdc00x6afdc00x6afdc00x6afdc00x6afdc013 0x6afdc00x6afdc00x6afdc0Bledne dane w wierszu: 5 Kod: bool sprawdz_linie( string dane ) { ifstream fin( dane.c_str() ); string line; if( !fin.good() ) return false; int wiersz = 0; while( !fin.eof() ) { int suma = 0; wiersz++; bool ok = true; while( !czyNapotkanoZnakNowegoWiersza( fin ) || fin.eof() ) { int liczba; char znak; fin >> liczba; if( fin.fail() ) { fin.clear(); fin >> znak; ok = false; } else { suma += liczba; } } if( ok == false ) cout << "Bledne dane w wierszu: " << wiersz << endl; else cout << suma << endl; } return true; }
EDIT: Już doszedłem gdzie popełniłem błąd. W funkcji czyNapotkanoZnakNowegoWiersza wpisałem cout << dane.get( cZnak ); . |
|
alloyZ |
Rozdział 34 Zadanie 2 [trudne] - niekończąca się pętla || o jedną linie za daleko » 2016-09-19 20:23:42 Cześć,
słuchajcie, kombinuje z zadaniem 2 z rozdziału 34 i mam taki problem - poniższy kod przedstawia moje wypociny i jeśli uruchomię go tak jak jest to wyświetla mi wszystko jak oczekuję (czyli 5 linii jak w pliku txt), ale pętla się nie zakańcza i muszę wychodzić poprzez ctrl+c. Natomiast jeśli usunę komentarz z argumentów drugiej funkcji WHILE z funkcji czyNapotkanoZnakNowegoWiersza pętla się zakańcza i wszystko jest PRAWIE ok lecz wyświetla mi informację o sumie z linii 6... a w pliku mam linii tylko 5. Zatem coś mi umyka i tu prośba do Was - oświećcie mnie co przeoczyłem.
MOJ KOD:
#include <iostream> #include <string> #include <fstream>
bool czyNapotkanoZnakNowegoWiersza( std::ifstream & plik ) { char cZnak; for(;; ) //nieskończona pętla { plik.clear(); cZnak = plik.peek(); //sprawdzamy jaki kolejny znak zostanie zwrócony przez operację odczytu if( plik.fail() || plik.bad() ) return false; //wystąpił błąd odczytu danych
if( !isspace( cZnak ) ) return false; //pobrany znak nie jest białym znakiem
plik.get( cZnak ); //odczytujemy biały znak z pliku if( plik.fail() || plik.bad() ) return false; //wystąpił błąd odczytu danych
if( cZnak == '\n' ) return true;
} //for }
void wczytaj(std::ifstream &plik, int iLiczba, char cZnak) { plik.clear(); int i=1; bool ok; int suma;
while(!plik.eof()) { ok=true; suma=0; while(!czyNapotkanoZnakNowegoWiersza(plik)/*&&!plik.eof()*/) { plik.clear(); plik>>iLiczba; if(plik.fail()) { plik.clear(); plik>>cZnak; ok=false; }else suma+=iLiczba; }
if(ok==false) std::cout<<"Bledne dane w linii "<<i<<std::endl; else std::cout<<"Suma w linii "<<i<<" = "<<suma<<std::endl; ++i; } }
bool wczytajPlik(std::string sNazwaPliku) { int iLiczba; char cZnak; //std::string linia[10]; std::ifstream plik; plik.open(sNazwaPliku.c_str());
if(!plik.good()) { std::cout<<"Otwarcie pliku zakonczone niepowodzeniem"; return false; }else std::cout<<"Plik OK"<<std::endl;
wczytaj(plik, iLiczba, cZnak);
plik.close(); std::cout<<"Plik zamkniety"; return true; }
int main() { int iLiczba; char cZnak;
wczytajPlik("31 Roz 34.txt");
return 0; } |
|
karambaHZP |
» 2016-09-19 21:05:56 To jest powód. EOF ustawia flagę dopiero gdy próbujesz odczytać z końca pliku. Po wczytaniu piątej linii nadal EOF == false, następnie pętla robi kolejną rundę i jest błąd odczytu (EOF), ale pętla i tak kończy obieg i dolicza kolejną inkrementację. ps: oczywiście zależy to jak kończy się ostatnia linia. |
|
igawar |
» 2016-09-21 20:47:58 karambaHZP to nie jest prawda co piszesz. Program który napisał alloyZ zapętla się w funkcji "czyNapotkanoZnakNowegoWiersza" Znak nowej linii kończący wiersz 5-ty spowoduje wykonanie instrukcji: if( ok == false ) std::cout << "Bledne dane w linii " << i << std::endl; else std::cout << "Suma w linii " << i << " = " << suma << std::endl;
++i; i powrót nie do pętli while(!plik.eof()) ale do pętli while(!czyNapotkanoZnakNowegoWiersza(plik)z funkcji "czyNapotkanoZnakNowegoWiersza" nigdy nie wyjdzie (zapętli się) bo znak EOF nie jest badany. Niech ktoś poprawi jak źle myślę. |
|
« 1 » 2 |