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 :) #include <iostream> #include <conio.h> #include <vector> #include <fstream> #include <string>
using namespace std;
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; }
|
|
malan |
» 2010-04-16 14:36:05 Takie drobne błędy są najgorsze do znalezienia ;). Podpowiedź: plik.open( "baza.txt", ios::out ); |
|
bartek483 Temat założony przez niniejszego użytkownika |
» 2010-04-16 14:44:53 Chodzi o tryb otwarcia pliku, dokladnie o ios::in? |
|
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.
|
|
|
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 :) |
|
malan |
» 2010-04-16 15:04:35 Sprawdź, jaką wartość ma temp: temp1 = sprawdz( typ ); cout << "temp = " << temp1 << endl; Jeżeli wartość ta będzie poprawna, to wrzuć jakąś przykładową zawartość pliku - sprawdzę u siebie. |
|
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 |
|
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: cout << "prod = " << prod << endl; cout << "typ = " << typ << endl << endl; ... po getline i zobacz co siedzi w tych zmiennych... |
|
« 1 » 2 |