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

Błąd podczas wczytywania danych z pliku

Ostatnio zmodyfikowano 2010-04-17 10:26
Autor Wiadomość
bartek483
Temat założony przez niniejszego użytkownika
Błąd podczas wczytywania danych z pliku
» 2010-04-16 14:22:54
Witamm

Poraz kolejny mam problem z wczytaniem z pliku i jak zwykle nie mam pojecia gdzie jest blad .. przeanalizowalem pare razy kod i nie widze wg mnie bledu, jakby ktos by mogl zerknac w moj kod bylbym bardzo wdzieczny, z gory dziekuje :)

C/C++
#include <iostream>
#include <conio.h>
#include <vector>
#include <fstream>
#include <string>

using namespace std;
//-------------------ENUM-Y----------------
enum PAMIEC { SDR = 0, DDR, DDR2, DDR3 };
enum RODZAJ { atramentowa = 4, laserowa };
//-----------------------------------------
class Podzespol
{
public:
    Podzespol( string p )
        : producent( p )
    { }
    virtual void Wyswietl() = 0;
   
protected:
    string producent;
};
//-----------------------------------------
class Procesor
    : public Podzespol
{
public:
    Procesor( string prd, int lb, double hz, int pwr )
        : Podzespol( prd )
        , lb_rdz( lb )
        , Hz( hz )
        , moc( pwr )
    { }
    void Wyswietl() { cout << producent << " " << lb_rdz << " " << Hz << " " << moc << "\n"; }
   
private:
    int lb_rdz;
    double Hz;
    int moc;
};
//-----------------------------------------
class Pamiec
    : public Podzespol
{
public:
    Pamiec( string _p, const PAMIEC _typ, int pjm )
        : Podzespol( _p )
        , memory( _typ )
        , pojemnosc( pjm )
    { }
    void Wyswietl() { cout << producent << " " << memory << " " << pojemnosc << "\n"; }
   
private:
    PAMIEC memory;
    int pojemnosc;
};
//-----------------------------------------
class Drukarka
    : public Podzespol
{
public:
    Drukarka( string _pd, const RODZAJ typ, int speed )
        : Podzespol( _pd )
        , o( typ )
        , szybkosc( speed )
    { }
    void Wyswietl() { cout << producent << " " << o << " " << szybkosc << "\n"; }
   
private:
    RODZAJ o;
    int szybkosc;
};
//-----------------------------------------
inline int sprawdz( const string & nazwa )
{
    if( nazwa == "cpu" ) return 0;
    else if( nazwa == "sdr" ) return 1;
    else if( nazwa == "ddr" ) return 2;
    else if( nazwa == "ddr2" ) return 3;
    else if( nazwa == "ddr3" ) return 4;
    else return - 2;
   
}
//-----------------------------------------
void odczytZpliku( vector < Podzespol *>& WEKTOR )
{
    string prod;
    string typ;
    int temp1, temp2, temp3;
    int lb_rdz;
    double hz;
    int moc;
    int pojemnosc;
    int spid;
   
    Podzespol * wsk = 0;
   
    ifstream plik;
    plik.open( "baza.txt", ios::out );
   
    if( plik.good() )
    {
        while( !plik.eof() )
        {
            getline( plik, prod );
            getline( plik, typ );
           
            temp1 = sprawdz( typ );
            //================================
            if( temp1 == 0 )
            {
                plik >> lb_rdz;
                plik >> hz;
                plik >> moc;
               
                wsk = new Procesor( prod, lb_rdz, hz, moc );
                WEKTOR.push_back( wsk );
            }
            //=================================
            else if( temp1 >= 1 && temp1 <= 4 )
            {
                plik >> pojemnosc;
               
                wsk = new Pamiec( prod, static_cast < PAMIEC >( sprawdz( typ ) ), pojemnosc );
                WEKTOR.push_back( wsk );
               
            }
            //=================================
            else if( temp1 > 4 )
            {
                RODZAJ o;
                if( typ == "atramentowa" ) o = atramentowa;
                else if( typ == "laserowa" ) o = laserowa;
               
                plik >> spid;
                wsk = new Drukarka( prod, o, spid );
                WEKTOR.push_back( wsk );
            }
        }
    }
    else cout << "Error .. \n";
   
    plik.close();
}
//-----------------------------------------
int main( int argc, char * argv[] )
{
    vector < Podzespol *> WEKTOR;
   
    odczytZpliku( WEKTOR );
   
    vector < Podzespol *>::iterator iter = WEKTOR.begin();
    vector < Podzespol *>::iterator endit = WEKTOR.end();
   
    for(; iter != endit; ++iter ) {
        ( * iter )->Wyswietl();
    }
   
    _getch();
    return EXIT_SUCCESS;
}
P-16190
malan
» 2010-04-16 14:36:05
Takie drobne błędy są najgorsze do znalezienia ;).
Podpowiedź:
plik.open( "baza.txt", ios::out );
P-16191
bartek483
Temat założony przez niniejszego użytkownika
» 2010-04-16 14:44:53
Chodzi o tryb otwarcia pliku, dokladnie o ios::in?
P-16193
malan
» 2010-04-16 14:49:22
Fragment kursu:
ios::in
(input - wejście/odczyt) Zezwolenie na odczytywanie danych z pliku.

ios::out
(output - wyjście/zapis) Zezwolenie na zapisywanie danych do pliku.
P-16196
bartek483
Temat założony przez niniejszego użytkownika
» 2010-04-16 14:51:38
Chcialem sie upewnic bo jak zmieniam na ios::in to rowniez nie odczytuje danych :)
P-16197
malan
» 2010-04-16 15:04:35
Sprawdź, jaką wartość ma temp:
C/C++
temp1 = sprawdz( typ );
cout << "temp = " << temp1 << endl;

Jeżeli wartość ta będzie poprawna, to wrzuć jakąś przykładową zawartość pliku - sprawdzę u siebie.
P-16198
bartek483
Temat założony przez niniejszego użytkownika
» 2010-04-16 15:33:00
Warotsc zmiennej temp jest poprawna.

Podaje przykladowy plik z danymi:

Kingstone ddr 512
Intel cpu 2 2.3 12
Lexmark 15 laserowa
P-16199
malan
» 2010-04-16 20:27:10
Błąd polega na tym, że źle wczytujesz dane ;). Jesteś pewny, że dla tych danych temp1 != -2 ? ;). Dodaj to:
C/C++
cout << "prod = " << prod << endl;
cout << "typ = " << typ << endl << endl;
... po getline i zobacz co siedzi w tych zmiennych...
P-16209
« 1 » 2
  Strona 1 z 2 Następna strona