maze Temat założony przez niniejszego użytkownika |
Odczyt tablicy z pliku tekstowego. fstream. » 2013-02-09 17:44:30 Czesc, walcze z odczytem danych z pliku tekstowego. Z zapisem problemow nie ma, tylko wlasnie nie moge cos dobrze zczytac. Jakby ktos mogl zerknac i cos podpowiedzie. baza_odczyt.open( "baza.txt" ); int wiersze;
if( baza_odczyt ) { string cos; int n = 0; while( getline( baza_odczyt, cos ) ) wiersze++; baza_odczyt.seekg( 0, ios::beg ); for( int i = 0; i < wiersze; i++ ) { baza_odczyt >> tab[ i ].id; baza_odczyt >> tab[ i ].marka; baza_odczyt >> tab[ i ].model; baza_odczyt >> tab[ i ].rocznik; baza_odczyt >> tab[ i ].cena; cout << baza_odczyt.tellg() << endl; } poz = wiersze; } else cout << "Blad otwarcia pliku";
baza_odczyt.close();
tak wiec tu jest kod odpowiedzialny za odczyt tablicy z pliku. Najpierw zliczam ilosc wierszy getlinem, a pozniej staram sie zapisac dane do tablicy TAB[]. tab deklaruje wczesniej przed odczytem, w pliku tekstowym sa zapisane wierszami struktury DDT o formie takiej jak powyzej mozna zobaczyc. zauwazylem ze tellg() zwraca za kazdym obrotem petli wartosc (-1), co oznaccza blad. tylko jak rozumiec ten blad, skoro plik otwiera sie dobrze? Bo zlicza ilosc wierszy prawidlowo, a pozniej seekg ustawia pozycje na poczatek pliku... Dzieki za pomoc. |
|
pekfos |
» 2013-02-09 18:00:49 Rozdzielasz zapisane dane białymi znakami? |
|
maze Temat założony przez niniejszego użytkownika |
» 2013-02-09 18:02:51 tak, jest wszytsko oddzielone spacjami. tak wyglada np. plik bazy: 1 Honda Civic 1999 2033 2 Opel Astra 2003 23000
tak wiec, numer na poczatku to .id, pozniej .marka .model .rocznik .cena moze dam caly kod bazy , mysle ze jest w miare czytelny. #include <iostream> #include <string> #include <fstream> using namespace std;
struct DDT { short id; string marka; string model; int rocznik; double cena; };
void wczytaj_dane( DDT * tablica, int n, int poz ); void wyswietl( DDT * tablica, int n, bool pozycja ); int szukaj( DDT * tablica, int * wyniki, int ilosc ); void edytuj( DDT * tablica, int n );
int main() { int ilosc = 0, zmiana = 0, poz = 0, pamiec = 0; DDT * baza = NULL; DDT tab[ 30 ]; char buf; int wyniki[ 10 ] = { }; ifstream baza_odczyt; baza_odczyt.open( "baza.txt" ); int wiersze; if( baza_odczyt ) { string cos; int n = 0; while( getline( baza_odczyt, cos ) ) wiersze++; baza_odczyt.seekg( 0, ios::beg ); for( int i = 0; i < wiersze; i++ ) { baza_odczyt >> tab[ i ].id; baza_odczyt >> tab[ i ].marka; baza_odczyt >> tab[ i ].model; baza_odczyt >> tab[ i ].rocznik; baza_odczyt >> tab[ i ].cena; cout << baza_odczyt.tellg() << endl; } poz = wiersze; } else cout << "Blad otwarcia pliku"; baza_odczyt.close(); cout << wiersze << " pozycji w bazie" << endl; cout << "sprawdzamy, tab[1].marka = " << tab[ 1 ].marka << endl; do { cout << endl << "Witaj w Auto Komisie" << endl << endl; cout << "Obecnie w bazie " << poz << " pozycji" << endl << endl; cout << "Wybierz opcje:" << endl << endl; cout << "1) Dodaj pojazdy do bazy" << endl; cout << "2) Wyswiel zawartosc bazy" << endl; cout << "3) Znajdz samochod" << endl; cout << "4) Edytuj baze" << endl << endl; cout << "5) Zakoncz program" << endl << endl; cin >> zmiana; if( zmiana == 5 ) break; if(( zmiana == 1 ) ||( zmiana == 2 ) ||( zmiana == 3 ) ||( zmiana == 4 ) ) { switch( zmiana ) { case 1: do { cout << "Ile pojazdow chcesz wprowadzic do bazy?" << endl; cin >> ilosc; if(( ilosc + poz ) > 30 ) { cout << "Zbyt duza ilosc elementow"; ilosc = NULL; } int rozmiar = ilosc + poz; delete[] baza; if( baza = new DDT[ rozmiar ] ) puts( "\nPrzydzielono pamiec\n" ); else puts( "\nBlad przypisania pamieci\n" ); for( int i = 0; i < poz; i++ ) { baza[ i ].id = tab[ i ].id; baza[ i ].marka = tab[ i ].marka; baza[ i ].model = tab[ i ].model; baza[ i ].rocznik = tab[ i ].rocznik; baza[ i ].cena = tab[ i ].cena; } } while( ilosc == 0 ); wczytaj_dane( baza, ilosc, poz ); poz = poz + ilosc; break; case 2: if( poz == 0 ) { cout << "Najpierw wprowadz dane pojazdow" << endl; break; } if( pamiec == 0 ) wyswietl( baza, poz, 0 ); else wyswietl( tab, poz, 0 ); break; case 3: { if( ilosc == 0 ) { cout << "Najpierw wprowadz dane pojazdow" << endl; break; } int buf = NULL, temp = NULL; temp = szukaj( baza, wyniki, poz ); for( int i = 0; i < temp; i++ ) { buf = wyniki[ i ]; cout << endl << "###########Wyniki Wyszukiwania###########" << endl; cout << baza[ buf ].marka << "::" << baza[ buf ].model << "::" << baza[ buf ].rocznik << "::" << baza[ buf ].cena << endl; cout << "###########*******************###########" << endl; } break; } case 4: if( pamiec == 1 ) edytuj( baza, poz ); else edytuj( baza, poz ); break; } } } while( zmiana != 5 ); FILE * baza_zapis = fopen( "baza.txt", "wt" ); if( baza_zapis == NULL ) puts( "\nBład otwarcia pliku do zapisu\n" ); for( int i = 0; i < poz; i++ ) fprintf( baza_zapis, "%hd %s %s %d %.0f \n", baza[ i ].id, baza[ i ].marka.c_str(), baza[ i ].model.c_str(), baza[ i ].rocznik, baza[ i ].cena ); fclose( baza_zapis ); cin.get(); delete[] baza; return 0; }
void wczytaj_dane( DDT * tablica, int n, int poz ) { for( int i = poz; i < n + poz; i++ ) { cout << endl << "Wprowadz dane " << i + 1 << "-go samochodu"; cout << endl << "Marka: "; cin >> tablica[ i ].marka; cout << endl << "Model: "; cin >> tablica[ i ].model; cout << endl << "Rocznik: "; cin >> tablica[ i ].rocznik; cout << endl << "Cena: "; cin >> tablica[ i ].cena; tablica[ i ].id = i + 1; } ; }
void wyswietl( DDT * tablica, int n, bool pozycja ) { cout << endl << "###############BAZA###############" << endl; if( pozycja == 1 ) { cout << tablica[ n ].id << "::" << tablica[ n ].marka << "::" << tablica[ n ].model << "::"; cout << tablica[ n ].rocznik << "r.::" << tablica[ n ].cena << " zl" << endl; } else for( int i = 0; i < n; i++ ) { cout << tablica[ i ].id << "::" << tablica[ i ].marka << "::" << tablica[ i ].model << "::"; cout << tablica[ i ].rocznik << "r.::" << tablica[ i ].cena << " zl" << endl; } cout << "##################################" << endl; }
void edytuj( DDT * tablica, int n ) { int edit; wyswietl( tablica, n, 0 ); cout << endl << "Ktora pozycje chcesz wyedytowac?"; cin >> edit; edit--; cout << endl << "Podaj marke: "; cin >> tablica[ edit ].marka; cout << endl << "Podaj model: "; cin >> tablica[ edit ].model; cout << endl << "Podaj rocznik: "; cin >> tablica[ edit ].rocznik; cout << endl << "Podaj cene: "; cin >> tablica[ edit ].cena; wyswietl( tablica, n, 0 ); }
int szukaj( DDT * tablica, int * wyniki, int n ) { string klucz; double kwota; int poz = NULL; cout << "Wprowadz szukane kryteria:" << endl; cout << "Jakiej marki poszukujesz?: "; cin >> klucz; cout << endl << "Podaj cene maksymalna: "; cin >> kwota; for( int i = 0; i < n; i++ ) { if(( tablica[ i ].marka == klucz ) &&( tablica[ i ].cena <= kwota ) ) { wyniki[ poz ] = i; poz++; }; } return( poz ); }
|
|
Monika90 |
» 2013-02-10 18:35:13 Wczytywanie najpierw wszystkich wierszy tylko po to by je policzyć, a potem odczyt całego pliku jeszcze raz, to nie jest najlepszy pomysł. Ale skoro już tak robisz, to powinieneś zainicjalizować zmienną wiersze wartością zero. Dodaj też baza_odczyt.clear(); przed baza_odczyt.seekg(0, ios::beg); |
|
« 1 » |