Nitr0Skay Temat założony przez niniejszego użytkownika |
Wygląda na to, że wyrazy się nie wczytują... » 2013-12-10 18:10:37 Witam. Mam pewien problem z programem. Oto kod programu: #include <iostream> #include <fstream> #include <string>
using namespace std; int parzyste( string wyraz ); int porownanieWyrazow( string wyraz, int k );
int main() { const int iloscNAPISOW = 1000; string pierwszyPlik = "napisy.txt"; string drugiPlik = "zadanie.txt"; string wyraz; fstream napisy; fstream zadanie; napisy.open( pierwszyPlik.c_str() ); if( !napisy.good() ) cout << "Nie udalo sie otworzyc pliku: " << pierwszyPlik << endl; int parzysteWyrazy = 0; while( !napisy.eof() ) { getline( napisy, wyraz ); parzysteWyrazy += parzyste( wyraz ); } napisy.seekg( 0, ios_base::beg ); int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for( int k = 2; k <= 16; k++ ) { napisy.seekg( 0, ios_base::beg ); while( !napisy.eof() ) { getline( napisy, wyraz ); rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k ); } } zadanie.open( drugiPlik.c_str() ); if( !zadanie.good() ) cout << "Nie udalo sie otworzyc pliku: " << drugiPlik << endl; zadanie << "a) Napisow parzystej dlugosci jest: " << parzysteWyrazy << "\n"; zadanie << "d) \n"; for( int k = 2; k <= 16; k++ ) zadanie << "k = " << k << ", wyrazow: " << rowneWyrazy[ k ] << "\n"; zadanie << "\n\nNitr0Skay\n\n"; zadanie.close(); napisy.close(); cout << "Koniec Programu." << endl; return 0; }
int parzyste( string wyraz ) { int parzysta = 0; parzysta =( wyraz.size() % 2 ); if( parzysta == 1 ) return 1; if( parzysta == 0 ) return 0; }
int porownanieWyrazow( string wyraz, int k ) { int dlugoscWyrazu = 0; dlugoscWyrazu = wyraz.size(); if( dlugoscWyrazu == k ) return 1; if( dlugoscWyrazu != k ) return 0; }
Problem jest z drugą częścią Zadania, które brzmi następująco: Dla każdej liczby k 2, 3, ...,16 podaj liczbę napisów o długości k znajdujących się w pliku napisy.txt, tzn. podaj, ile jest napisów 2-znakowych, ile jest napisów 3-znakowych itd. Założenie to ma realizować ta część Kodu: int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for( int k = 2; k <= 16; k++ ) { napisy.seekg( 0, ios_base::beg ); while( !napisy.eof() ) { getline( napisy, wyraz ); rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k ); } }
Oto co się pokazuje w pliku: a) Napisow parzystej dlugosci jest: 456 d) k = 2, wyrazow: 0 k = 3, wyrazow: 0 k = 4, wyrazow: 0 k = 5, wyrazow: 0 k = 6, wyrazow: 0 k = 7, wyrazow: 0 k = 8, wyrazow: 0 k = 9, wyrazow: 0 k = 10, wyrazow: 0 k = 11, wyrazow: 0 k = 12, wyrazow: 0 k = 13, wyrazow: 0 k = 14, wyrazow: 0 k = 15, wyrazow: 0 k = 16, wyrazow: 0
Nitr0Skay
A więc, wygląda na to, że najprawdopodobniej Wyrazy się nie wczytują, przez co dlugoscWyrazu = wyraz.size(); zwraca 0, przez co funkcja także zwraca zero, a ja nie wiem, co może być tego przyczyną. Nie mogę nigdzie znaleźć miejsca, gdzie mógłbym popełnić jakiś błąd. Byłbym wdzięczny, gdybyście mnie naprowadzili, bo już chyba dobre 40 minut się z tym męczę.... Z góry dziękuję. |
|
MrPoxipol |
» 2013-12-10 18:38:18 while( !napisy.eof() ) { getline( napisy, wyraz ); parzysteWyrazy += parzyste( wyraz ); }
Krócej będzie (i lepiej): string text, buff; while( getline( file, buff ) ) { text += buff; }
|
|
Adik80 |
» 2013-12-10 18:58:26 po dojsciu do konca pliku ystawia sie flaga eof, przesuniecie na poczatek pliku nie resetuje flag, dlatego przy kolejnej petli niczego nie odczyta. Ptrzebujesz dodac plik.clear() po seekg(). |
|
Nitr0Skay Temat założony przez niniejszego użytkownika |
» 2013-12-10 21:14:21 A więc trzeba wyczyścić flagę eof. Dobrze, teraz rozumiem. Zaraz poprawię. A więc tak. Zrobiłem coś takiego: int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for( int k = 2; k <= 16; k++ ) { napisy.seekg( 0, ios_base::beg ); while( !napisy.eof() ) { getline( napisy, wyraz ); rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k ); } napisy.clear(); }
I działa, ale zastanawia mnie jedno. Nie rozumiem czegoś takiego: int rowneWyrazy[ 18 ] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; for( int k = 2; k <= 16; k++ ) { napisy.seekg( 0, ios_base::beg ); napisy.clear(); while( !napisy.eof() ) { getline( napisy, wyraz ); rowneWyrazy[ k ] += porownanieWyrazow( wyraz, k ); } }
W tym powyższym przypadku, jak dodam napisy.clear(); przed pętlą z .eof() To wówczas bufor się nie czyści i nadal nie czyta wyrazów. Nie bardzo rozumiem, dlaczego .clear() musi być po pętli, a nie może być przed pętlą... |
|
Nitr0Skay Temat założony przez niniejszego użytkownika |
» 2013-12-11 15:57:20 Ktoś mógłby mi to wytłumaczyć ?? Nigdzie nie mogę znaleźć odpowiedzi Na to, dlaczego w pierwszym przypadku działa, a w drugim nie do końca. |
|
Adik80 |
» 2013-12-11 16:30:54 Wyglada ze jesli eofbit jest ustawiony przed wywolaniem seekg to seekg nic nie zrobi, trzeba clear dac przed seekg |
|
« 1 » |