Pobieranie danych z pliku do wektora struktury.

Odpowiedz Nowy wątek
2014-12-31 16:13
0

Witam.
Mam pewien problem z moim kodem. Chodzi tu o wczytywanie wartości z pliku. Program ma w zamyśle służyć do obsługi banku. Jest to mój projekt na studia. I mam problem ponieważ fstream dobrze wyciąga dane z pliku. Sprawdzałem w każdym case cout-em. Wyświetla poprawnie Lecz kiedy ma to zapisać do wektora nic się nie dzieje niestety. Nie zapisuje do wektora ponieważ późniejsze odczytanie nic nie daje.

 
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
struct konto{
    string name;
    string number;
    float balance;
};
 
int main(){
    fstream plik;
    vector <konto> konta;
    string nr, n;
    float b=0;
    int licznik=1;
    plik.open("konta.txt", ios::in | ios::out | ios::app);
    string linia;
    while (getline(plik, linia)){
        switch(licznik){
                case 1: {n=linia; break;}
                case 2: {nr=linia; break;}
                case 3: {b=atof(linia.c_str()); konta.push_back (konto {n, nr, b} ); break;}
                }
    }
    /*cin >> nr;
    cin.ignore();
    if (nr.length()==2){
        cout << "Podaj nazwe konta:" << endl;
        getline (cin, n, '\n');
        cout << "Ile chcesz wplacic pieniedzy?" << endl;
        cin >> b;
        konta.push_back  (konto {n, nr, b} );*/
        for( int i = 0; i < konta.size(); i++ )
        {
            cout << endl;
            cout << "Nazwa konta: " << konta[ i ].name << endl;
            cout << "Numer konta: " << konta[ i ].number << endl;
            cout << "Balans konta: " << konta[ i ].balance << endl;
        }
        //cout << "Twoje konto zostalo utworzone!";
        //plik << n << endl;
        //plik << nr << endl;
        //plik << b << endl << endl;
        plik.close();
    }
    //else{
        //cout << "Bledny numer konta.";
    //}
 

Pozostało 580 znaków

2014-12-31 16:18
0

Przyglądam sie temu, zaraz dokładniejszej udziele odpowiedzi ale, na pierwszy rzut oka to Ty nigdzie nie inkrementujesz licznika, i dlaczego zaczynasz od 1, a nie 0?

Pozostało 580 znaków

2014-12-31 16:18
0
    for(konto tmp;(getline(plik,tmp.name))&&((getline(plik,tmp.number))&&(plik>>tmp.balance>>ws);) konta.push_back(tmp);

ws - z <iomanip>


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2014-12-31 16:19

Pozostało 580 znaków

2014-12-31 16:22
0
 
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <cstdlib>
 
using namespace std;
 
struct konto{
    string name;
    string number;
    float balance;
};
 
int main(){
    fstream plik;
    vector <konto> konta;
    string nr, n;
    float b=0;
    int licznik=0;
    plik.open("konta.txt", ios::in | ios::out | ios::app);
    string linia;
    while (getline(plik, linia)){
        switch(licznik){
                case 0: {n=linia; break;}
                case 1: {nr=linia; break;}
                case 2: {b=atof(linia.c_str()); konta.push_back (konto {n, nr, b} ); break;}
                }
                licznik++;
    }
    /*cin >> nr;
    cin.ignore();
    if (nr.length()==2){
        cout << "Podaj nazwe konta:" << endl;
        getline (cin, n, '\n');
        cout << "Ile chcesz wplacic pieniedzy?" << endl;
        cin >> b;
        konta.push_back  (konto {n, nr, b} );*/
        for( int i = 0; i < konta.size(); i++ )
        {
            cout << endl;
            cout << "Nazwa konta: " << konta[ i ].name << endl;
            cout << "Numer konta: " << konta[ i ].number << endl;
            cout << "Balans konta: " << konta[ i ].balance << endl;
        }
        //cout << "Twoje konto zostalo utworzone!";
        //plik << n << endl;
        //plik << nr << endl;
        //plik << b << endl << endl;
        plik.close();
    }
    //else{
        //cout << "Bledny numer konta.";
    //}

Oto działający kod, choć proponuje Ci usunąć tego switcha bo to nieciekawe rozwiązanie.
Problem polegał na tym że nie inkrementowałeś licznika, więc wykonywał sie tylko 1 przypadek.
Najlepiej rozwiąż ten problem tak jak kolega up Ci pokazał.

edytowany 3x, ostatnio: Proxima, 2014-12-31 16:27

Pozostało 580 znaków

2014-12-31 16:48
0

Ogółem to próbowałem zrobić to na ifach i robić tak, że jeśli licznik%1==0 to ma zapisac w jedno miejsce jak licznik%2 to w drugie mod3 to 3 i tak zapetlic ale nie działało. Z licznikiem waszym działa. Ale jak teraz zrobić, żeby wczytało więcej linijek niż 3? I za każdym razem zapisywalo dobrze? Dajmy, że chce mieć 5 raazy te 3 linijki ściągnięte. Jak to zaimplementować? Kodu kolegi _13th_Dragon nie rozumiem.

edytowany 1x, ostatnio: aposka, 2014-12-31 16:48

Pozostało 580 znaków

2014-12-31 17:15
0
    string linia, linia1, linia2;
    while (getline(plik, linia) && getline(plik, linia1) && getline(plik, linia2)){
        n = linia;
        nr = linia1;
        b = atof(linia2.c_str());
        konta.push_back(konto {n, nr, b});
 
    } 

Jeśli dane bedą zawsze prawidłowe to możesz zrobić to tak.
To sposób podobny do sposobu _13th_Dragon, lecz nieco uproszczony.
Najwrażliwsza część to konwersja, 3 linia danych powinna zawsze być prawidłowa.
Wykrycie/Korekcja błędów, to zadanie dla Ciebie :)

edytowany 2x, ostatnio: Proxima, 2014-12-31 17:18

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0