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

Przesyłanie kontenera vector do funkcji

Ostatnio zmodyfikowano 2014-01-15 16:34
Autor Wiadomość
chitler
Temat założony przez niniejszego użytkownika
Przesyłanie kontenera vector do funkcji
» 2014-01-14 23:16:21
Próbując ogarnąć vectora, napisałem taki program. W ogóle doszedłem do tego że w funkcji addperson, argument musi być przesyłany przez referecję( w takiej zwykłej przesyłanej tablicy, nie musi przecież )

Normalne jest to że, przy pierwszej pętli( zrobioną goto ) w funkcji main gdy dodam osobę(addperson) a potem będę chciał wyświetlić rekordy, do tej pory dodane otrzymam jeden, do tej pory dodany wpis.

Ale za drugim, i każdym następnym razem, gdy teoretycznie dodaje nowy wpis, funkcja showall wyświetla tylko ten ostatni. Jak powinienem to zrobić, aby się ładnie wszystko dodawało i potem wyświetlało?

Pozdrawiam

C/C++
#include<iostream>
#include<string>
#include<vector>
using namespace std;

struct rekord
{
    //public:
    string nazwa;
    int numer;
   
    rekord( string nazwa, int numer );
};

rekord::rekord( string xnazwa, int xnumer )
    : nazwa( xnazwa )
    , numer( xnumer )
{
}
void addperson( vector < rekord >& tablica )
{
    string nazwa;
    int numer;
    cout << "podaj nazwe: "; cin >> nazwa;
    cout << "podaj numer: "; cin >> numer;
    tablica.push_back( rekord( nazwa, numer ) );
    cout << "sukces" << endl;
}

void showall( vector < rekord >& tablica )
{
    for( int i = 0; i < tablica.size(); i++ )
    {
        cout << "Nazwa: " << tablica[ i ].nazwa << endl;
        cout << "numer: " << tablica[ i ].numer << endl;
    }
}


int main()
{
    start:
   
    vector < rekord > tablica;
    addperson( tablica );
    cout << "dodano" << endl;
    showall( tablica );
    cout << "wyswietlono" << endl;
   
    goto start;
   
    return 0;
}
P-102202
killjoy
» 2014-01-14 23:30:39
Po pierwsze nie powinno się robić w ten sposób pętli, bo zmniejsza to czytelność kodu. Co do błędu, tworzysz
vector < rekord > tablica;
 lokalnie, w twojej "pętli" właśnie, więc po przeskoku do początku bloku, tworzony jest nowy vector.
Rozwiązanie: deklaruj
vector < rekord > tablica;
 przed
start:
P-102203
chitler
Temat założony przez niniejszego użytkownika
» 2014-01-15 16:34:10
Wielkie dzięki, faktycznie, głupi błąd z mojej strony. Drążąc temat dalej chciałem aby moja dynamiczna tablica była zapisywana do pliku, a gdy następnym razem będę otwierał program, automatycznie będzie załadowywana. Mam problem z odczytywaniem zapisanych wartości struktury z pliku. Mógłby się ktoś przyjrzeć mojej funkcji load? Będę wdzięczny. ( dopiero zacząłem obsługę plików, tak więc przepraszam za trywialne błędy )

C/C++
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
using namespace std;

struct rekord
{
    //public:
    string nazwa;
    int numer;
   
    rekord( string nazwa, int numer );
};

rekord::rekord( string xnazwa, int xnumer )
    : nazwa( xnazwa )
    , numer( xnumer )
{
}
void addperson( vector < rekord >& tablica )
{
    static int licznik = 0;
    string nazwa;
    int numer;
    cout << "podaj nazwe: "; cin >> nazwa;
    cout << "podaj numer: "; cin >> numer;
    tablica.push_back( rekord( nazwa, numer ) );
    cout << "sukces" << endl;
    ofstream strumien( "dane.txt", ios::app );
    if( strumien )
    {
        strumien << tablica[ licznik ].nazwa << endl;
        strumien << tablica[ licznik ].numer << endl;
    }
    else
    {
        cout << "Blad zapisu!" << endl;
    }
    licznik++;
}

void load( vector < rekord >& tablica )
{
    ifstream strumien( "dane.txt" );
    if( strumien )
    {
        for( int i = 0; i; i++ )
        {
            bool check = getline( strumien, tablica[ i ].nazwa );
            if( check == 1 )
            {
                string nazwa;
                int numer;
                tablica.push_back( rekord( nazwa, numer ) );
                strumien >> tablica[ i ].nazwa;
                strumien >> tablica[ i ].numer;
            }
           
            else
                 break;
           
        }
    }
    else
    {
        cout << "Blad odczytu!" << endl;
    }
}

void showall( vector < rekord >& tablica )
{
   
    for( int i = 0; i < tablica.size(); i++ )
    {
        cout << "Nazwa: " << tablica[ i ].nazwa << endl;
        cout << "numer: " << tablica[ i ].numer << endl;
    }
}


int main()
{
    vector < rekord > tablica;
   
    do {
        load( tablica );
        addperson( tablica );
        cout << "dodano" << endl;
        showall( tablica );
        cout << "wyswietlono" << endl;
       
       
    } while( true );
   
    return 0;
}
P-102236
« 1 »
  Strona 1 z 1