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

Odczyt tablicy z pliku tekstowego. fstream.

Ostatnio zmodyfikowano 2013-02-10 18:35
Autor Wiadomość
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.

C/C++
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.
P-76040
pekfos
» 2013-02-09 18:00:49
Rozdzielasz zapisane dane białymi znakami?
P-76043
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.

C/C++
//Przypisanie struktur------------------------------
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

//struktura bazy samochodow autokomisu

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;
    //ofstream baza_zapis;
   
    //**************Odczyt bazy z pliku*****************//
   
    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 );
   
    //****************************************************************
    //Zapisywanie bazy do pliku >>>
   
    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 ) //jesli argument 'pozycja' rowna sie jeden, wyswietlamy tylko element z pozycji n, w przeciwnym razie wyswietlamy cala tablice
{
    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 );
}
P-76044
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);
P-76110
« 1 »
  Strona 1 z 1