luuuzik Temat założony przez niniejszego użytkownika |
[C++] Sumowanie danych z pliku » 2015-01-28 16:32:11 Witam, napisałem program który ma za zadanie zapisać w tablicach dane z pliku, oraz zsumować modele "Fiat". Wszystko działa poza pętlą sumującą "Fiaty". Plik z którego pobieram dane nazywa się "sam.txt", a to jest jego zawartość (część danych jest wymyślona): Fiat; 126p; 0,65; 140, Audi; S6; 4,2; 250, Syrena; 105; 0,84; 120, Mazda; R14; 4; 250, WV; A4; 4; 250, Opel; Corsa; 3; 220, Kolejno od lewej to: Marka, Model, Pojemność silnika, Max prędkość. O to kod: #include <iostream> #include <fstream> #include <string> using namespace std;
bool wczytaj_plik( string pliczek ) { ifstream plik; plik.open( pliczek.c_str() ); if( !plik.good() ) { cout << "Nie udalo sie otworzyc pliku" << endl; return false; } else if( plik.good() ) { string marka[ 6 ]; string model[ 6 ]; string poj_silnika[ 6 ]; string max_predkosc[ 6 ]; string wyraz; string wyraz2; string wyraz3; string wyraz4; int i, j; i = 0; int ilosc_fiatow = 0; string Fiat; do { getline( plik, wyraz, ';' ); marka[ i ] = wyraz; getline( plik, wyraz2, ';' ); model[ i ] = wyraz2; getline( plik, wyraz3, ';' ); poj_silnika[ i ] = wyraz3; getline( plik, wyraz4, ',' ); max_predkosc[ i ] = wyraz4; i++; if( wyraz == Fiat ) { cout << wyraz << endl; ilosc_fiatow++; cout << "Ilosc fiatow wynosi: " << ilosc_fiatow << endl; } } while( i < 6 ); cout << "A o to dane aut: " << endl; j = 0; cout << "\nMarka" << " Model" << " Pojemnosc silnika" << " Max predkosc" << endl; do { cout << marka[ j ] << "\t" << model[ j ] << "\t\t" << poj_silnika[ j ] << "\t " << max_predkosc[ j ] << endl; j++; } while( j < 6 ); } return true; }
int main() { if( !wczytaj_plik( "sam.txt" ) ) { cout << "Nie udalo sie wczytac pliku!" << endl; } return 0; }
Jakieś wskazówki jak naprawić pętlę zliczającą Fiaty? |
|
los7 |
» 2015-01-28 17:57:41 Musisz sprawdzać czy wyraz == "Fiat" zamiast wyraz == Fiat Albo chociaż zapisać "Fiat" w zmiennej Fiat |
|
luuuzik Temat założony przez niniejszego użytkownika |
» 2015-01-28 21:13:19 Zmieniłem wyraz == Fiat na wyraz == "Fiat" tak jak sugerowałeś, i zaczęło podliczać jednakże nie podlicza wszystkich Fiatów z pliku ( dodałem jedną nową linijkę z Fiatem, żeby sprawdzić czy sumowanie działa). |
|
michal11 |
» 2015-01-28 22:56:34 No to jakie wyniki dostajesz a jakich oczekujesz ?
Nie wiem czy dodanie kolejnej linijki w pliku coś zmieni jeżeli w pętli wczytujesz tylko pierwszych 6 linii. |
|
luuuzik Temat założony przez niniejszego użytkownika |
» 2015-01-29 10:39:27 Otrzymuję zwrot w postaci " Ilosc fiatow wynosi: 1" a powinno być "Ilosc fiatow wynosi: 2". Jeżeli chodzi o pętle i tablice to oczywiście je powiększyłem po dodaniu nowej linijki, tak więc jest ona w całości wczytywana do pliku. Tylko to sumowanie mi nie działa jak trzeba... |
|
michal11 |
» 2015-01-29 11:40:06 Pokaż aktualny kod i plik wejściowy. |
|
luuuzik Temat założony przez niniejszego użytkownika |
» 2015-01-29 16:11:57 Aktualny kod: #include <iostream> #include <fstream> #include <string> using namespace std;
bool wczytaj_plik( string pliczek ) { ifstream plik; plik.open( pliczek.c_str() ); if( !plik.good() ) { cout << "Nie udalo sie otworzyc pliku" << endl; return false; } else if( plik.good() ) { string marka[ 15 ]; string model[ 15 ]; string poj_silnika[ 15 ]; string max_predkosc[ 15 ]; string wyraz; string wyraz2; string wyraz3; string wyraz4; int i, j; i = 0; int ilosc_fiatow = 0; string Fiat; do { getline( plik, wyraz, ';' ); marka[ i ] = wyraz; if( wyraz == "Fiat" ) { cout << wyraz << endl; ilosc_fiatow++; cout << "Ilosc fiatow wynosi: " << ilosc_fiatow << endl; } getline( plik, wyraz2, ';' ); model[ i ] = wyraz2; getline( plik, wyraz3, ';' ); poj_silnika[ i ] = wyraz3; getline( plik, wyraz4, ',' ); max_predkosc[ i ] = wyraz4; i++; } while( i < 15 ); cout << "A o to dane aut: " << endl; j = 0; cout << "\nMarka" << " Model" << " Pojemnosc silnika" << " Max predkosc" << endl; do { cout << marka[ j ] << "\t" << model[ j ] << "\t\t" << poj_silnika[ j ] << "\t " << max_predkosc[ j ] << endl; j++; } while( j < 15 ); } return true; }
int main() { if( !wczytaj_plik( "samy.txt" ) ) { cout << "Nie udalo sie wczytac pliku!" << endl; } return 0; }
Zawartość pliku "samy.txt": Fiat; 126p; 0,65; 140, Audi; S6; 4,2; 250, Syrena; 105; 0,84; 120, Mazda; R14; 4; 250, WV; A4; 4; 250, Opel; Corsa; 3; 220, Fiat; 125p; 0,7; 140, Mazda; M4; 3; 170, Ferrari; Enzo; 4; 370, Audi; S4; 3,5; 310, Opel; Insignia; 2,5; 170, Syrena; 106; 0,91; 135, Wv; Golf; 3,2; 220, Opel; Nova; 2,5; 170, Opel; C3; 2,5; 150, |
|
michal11 |
» 2015-01-29 19:19:39 Nie zlicza ci następnych Fiatów ponieważ getline wczytuje także znak nowej linii (możesz to sprawdzić porównując wyraz z "\nFiat"). Jeżeli możesz edytować swój plik wejściowy to usuń z niego wszystkie , na końcu i wczytuj ostatnie dane tak getline( plik, wyraz4 ); . Jeżeli nie możesz go edytować to masz 3 opcje, albo wczytać tak jak wcześniej pokazałem ostatnie dane i usunąć sobie ten przecinek, albo wczytać ten znak nowej linii do jakiejś śmieciowej zmiennej(to chyba doś słabe rozwiązanie) albo usunąć ten znak nowej linii z pierwszego wczytanej nazwy pojazdu(pomijając oczywiście pierwsze wczytanie). |
|
« 1 » 2 |