Lekcja 4.33
Ostatnio zmodyfikowano 2016-08-29 21:34
Anonim47 Temat założony przez niniejszego użytkownika |
Lekcja 4.33 » 2016-07-26 20:55:22 Witam. Mam problem z rozwiązaniem tego problemu bez rezerwacji tablic. Jak można bez rezerwacji np.liczba[100],zarezerwować tylko tyle ile jest wyrazów w pliku. #include <iostream> #include <fstream>
using namespace std; bool odczytajDane( string nazwapliku ) { int suma = 0; ifstream plik; plik.open( nazwapliku.c_str() ); if( !plik.good() ) return false; int i = 0, liczba[ 100 ]; while( true ) { plik >> liczba[ i ]; cout << liczba[ i ] << " "; suma += liczba[ i ]; i++; if( !plik.good() ) { cout << "\n Suma wynosi:" << suma << endl; return true; } } return true; } int main() { string nazwapliku = "plik.txt"; if( !odczytajDane( nazwapliku ) ) cout << "Nie udalo sie odczytac danych" << endl; return 0; }
|
|
carlosmay |
» 2016-07-26 21:38:54 std::vector<> - dynamicznie dodaje elementy (póki jest miejsce). |
|
Anonim47 Temat założony przez niniejszego użytkownika |
» 2016-07-27 12:30:42 @carlosmay Dzięki za podpowiedź. PS. Kod wstawiłem tak while( true ) { plik >> x; dane.push_back( x ); cout << dane[ i ] << "\n"; suma += dane[ i ]; i++; if( !plik.good() ) { cout << "\n Suma wynosi:" << suma << endl; return true; } }
|
|
carlosmay |
» 2016-07-27 14:13:53 Można to jeszcze uprościć: while( plik >> x ) { dane.push_back( x ); }
|
|
jundymek |
» 2016-08-18 00:17:28 Mam problem z opisywanym zadaniem. Niestety utknąłem i starałem się wzorować na kodzie opisanym w tym temacie. Mam coś takiego: #include <iostream> #include <fstream> #include <vector>
using namespace std;
bool wczytaj_plik( string dane ) { ifstream plik; plik.open( dane.c_str() ); if( !plik.good() ) return false; int x; int suma = 0; int i = 0; vector < int > liczba; while( true ) { plik >> x; liczba.push_back( x ); cout << liczba[ i ] << "\n"; suma += liczba[ i ]; i++; if( !plik.good() ) { cout << "SUMA: " << suma; cout << liczba.size(); return true; } } return true; }
int main() { string dane = "liczby.txt"; wczytaj_plik( dane ); return 0; }
W pliku tekstowym mam 1 4 5. cout << liczba[ i ] << "\n" zwraca mi 1 4 5 5. Program dwukrotnie wypisuje ostatnią liczbę i wynik jest zawsze powiększony o tą liczbę. Gdzie popełniam błąd? |
|
carlosmay |
» 2016-08-18 06:33:37 Program dwukrotnie wypisuje ostatnią liczbę i wynik jest zawsze powiększony o tą liczbę. |
Ponieważ ustawienie flagi dla metody good() na false nastąpi po nieudanej próbie odczytania danch, czyli niewłaściwa kolejność operacji. Tak powinna być: Post wyżej jest fajny i skuteczny sposób pobierania danych z pliku przy użyciu pętli while |
|
jundymek |
» 2016-08-18 09:45:46 Post wyżej jest fajny i skuteczny sposób pobierania danych z pliku przy użyciu pętli while |
Tak - działa bez zarzutu. Niemniej chciałem spróbować przerobić ten sposób z vectorem i niestety nie udaje mi się. Zamieniłem if(!plik.good()) na if(plik.good()) i dalej pobiera mi podwójnie ostatnią liczbę... #include <iostream> #include <fstream> #include <vector>
using namespace std;
bool wczytaj_plik( string dane ) { ifstream plik; plik.open( dane.c_str() ); if( !plik.good() ) return false; int x; int suma = 0; int i = 0; vector < int > liczba; while( true ) { if( plik.good() ) { plik >> x; liczba.push_back( x ); cout << liczba[ i ] << "\n"; suma += liczba[ i ]; i++; } else { cout << "SUMA: " << suma; cout << liczba.size(); return true; } } return true; }
int main() { string dane = "liczby.txt"; wczytaj_plik( dane ); return 0; }
|
|
carlosmay |
» 2016-08-18 11:42:58 Nadal jest niewłaściwa kolejność. Ma być: ps. funkcja zwraca wartość typu bool , a nic z tym nie robisz. |
|
« 1 » 2 |