Przesyłanie kontenera vector do funkcji
Ostatnio zmodyfikowano 2014-01-15 16:34
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 #include<iostream> #include<string> #include<vector> using namespace std;
struct rekord { 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; }
|
|
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: |
|
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 ) #include<iostream> #include<string> #include<vector> #include<fstream> using namespace std;
struct rekord { 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; }
|
|
« 1 » |