Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Sumowanie danych z pliku

Ostatnio zmodyfikowano 2015-01-29 19:55
Autor Wiadomość
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:
C/C++
#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?
P-125676
los7
» 2015-01-28 17:57:41
Musisz sprawdzać czy
wyraz == "Fiat"
 zamiast
wyraz == Fiat
 Albo chociaż zapisać "Fiat" w zmiennej Fiat
P-125680
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).
P-125688
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.
P-125705
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...
P-125713
michal11
» 2015-01-29 11:40:06
Pokaż aktualny kod i plik wejściowy.
P-125716
luuuzik
Temat założony przez niniejszego użytkownika
» 2015-01-29 16:11:57
Aktualny kod:
C/C++
#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,
P-125727
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).
P-125751
« 1 » 2
  Strona 1 z 2 Następna strona