Struktury i odczyt z pliku
Ostatnio zmodyfikowano 2017-01-26 10:01
ManiekB Temat założony przez niniejszego użytkownika |
Struktury i odczyt z pliku » 2017-01-25 21:17:56 Witam. Mam problem z programem wrzuconym poniżej. Program z pliku tekstowego ma wczytywać do tablicy struktur imiona i nazwiska osób, a następnie zwrócić ile z tych osób ma nazwisko na literę podaną przez użytkownika. Program się kompiluje bez problemu, lecz po odpaleniu i podaniu zmiennej n mniejszej od 6 (ilość osób które chcemy wczytać) to program przestaje działać. Ktoś ma pomysł co może być nie tak? #include <iostream> #include <fstream> #include <cstdlib> #include <stdlib.h> using namespace std; struct data { string imie; string nazwisko; }; int funkcja( data * tablica, char a, char b, int n ) { int licznik = 0; for( int i = 0; i < n; i++ ) { if( tablica[ i ].nazwisko[ 0 ] == a || tablica[ i ].nazwisko[ 0 ] == b ) licznik++; } return licznik; }
int main() { int i = 0, n; char a, b; cout << "Ile osob?" << endl; cin >> n; data * tab = new data[ n ]; fstream plik; plik.open( "doc.txt", ios::out | ios::in ); if( plik.good() == true ) { cout << "Otwarto plik" << endl; } else { cout << "Nie mozna otworzyc pliku"; } while( !plik.eof() ) { getline( plik, tab[ i ].imie, ' ' ); getline( plik, tab[ i ].nazwisko ); i++; } cout << "Wprowadź literki "; cin >> a >> b; data * wsk = tab; int ile = funkcja( wsk, a, b, n ); cout << "Osob o nazwisku na litere" << a << " lub " << b << " jest " << ile << endl; plik.close(); return 0; } . |
|
mateczek |
» 2017-01-26 10:01:56 Twój błąd polega na tym, że nie sprawdzasz przekroczenia tablicy. Wpisujesz cały plik nawet gdy w tablicy nie masz miejsca #include <iostream> #include <fstream> #include <cstdlib> #include <stdlib.h> using namespace std; struct data { string imie; string nazwisko; };
istream & operator >>( istream & plik, data & d ) { return plik >> d.imie >> d.nazwisko;; }
int funkcja( data * tablica, char a, char b, int n ) { int licznik = 0; for( int i = 0; i < n; i++ ) { if( tablica[ i ].nazwisko[ 0 ] == a || tablica[ i ].nazwisko[ 0 ] == b ) licznik++; } return licznik; }
int main() { int n; char a, b; ifstream plik( "doc.txt" ); if( plik ) { cout << "Otwarto plik" << endl; } else { cout << "Nie mozna otworzyc pliku"; return 0; } cout << "Ile osob?" << endl; cin >> n; data * tab = new data[ n ]; int counter = 0; while(( counter < n ) &&( plik >> tab[ counter++ ] ) ); cout << "Wprowadź literki "; cin >> a >> b; int ile = funkcja( tab, a, b, n ); cout << "Osob o nazwisku na litere" << a << " lub " << b << " jest " << ile << endl; return 0; } jak chcesz wczytać cały plik to najwygodniej użyć std::vector (bo nie musisz deklarować rozmiaru tablicy) #include <iostream> #include <fstream> #include<vector> using namespace std; struct data { string imie; string nazwisko; };
istream & operator >>( istream & plik, data & d ) { return plik >> d.imie >> d.nazwisko;; }
int funkcja( vector < data > tablica, char a, char b ) { int licznik = 0; for( size_t i = 0; i < tablica.size(); i++ ) { if( tablica[ i ].nazwisko[ 0 ] == a || tablica[ i ].nazwisko[ 0 ] == b ) licznik++; } return licznik; }
int main() { char a, b; ifstream plik( "doc.txt" ); if( plik ) { cout << "Otwarto plik" << endl; } else { cout << "Nie mozna otworzyc pliku"; return 0; } vector < data > tablica; data tempObj; while( plik >> tempObj ) { tablica.push_back( tempObj ); } cout << "Wprowadź literki "; cin >> a >> b; int ile = funkcja( tablica, a, b ); cout << "Osob o nazwisku na litere" << a << " lub " << b << " jest " << ile << endl; return 0; } |
|
« 1 » |