bartek483 Temat założony przez niniejszego użytkownika |
[C++] Wczytanie danych z pliku » 2010-05-11 23:53:07 Witammm Mam problem z odczytaniem z pliku danych a dokladniej jednego elementu, drugi parametr konstruktora (nazwa) jesli ktos by mogl mi dac wskazowke gdzie szukac bledu bede baaaaardzo wdzieczny :):) Podaje kod ( niestety zapomnialem jakie sa tu znaczniki na kod ): #include <iostream> #include <fstream> #include <vector>
using namespace std;
enum Kategoria { Informacje = 0, Rozrywka, Film, Muzyka, Inne };
class Kanal { public: Kanal( const int _numer, const char * _nazwa, const double _hz, Kategoria _o ); int odczyt_kanal() const { return nr_kanal; } char * odczyt_nazwa() const { return nazwa; } double odczyt_hz() const { return Hz; } int odczyt_o() const { return o; } void Wyswietl() const; ~Kanal() { delete[] nazwa; } private: int nr_kanal; char * nazwa; double Hz; Kategoria o; };
Kanal::Kanal( const int _numer, const char * _nazwa, const double _hz, Kategoria _o ) : nr_kanal( _numer ) , Hz( _hz ) , o( _o ) { nazwa = new char[ 40 ]; strcpy( nazwa, _nazwa ); }
void Kanal::Wyswietl() const { cout << nr_kanal << " " << nazwa << " " << Hz << " "; if( o == 0 ) cout << "Informacje."; else if( o == 1 ) cout << "Rozrywka."; else if( o == 2 ) cout << "Film."; else if( o == 3 ) cout << "Muzyka."; else if( o == 4 ) cout << "Inne."; }
class Telewizor { public: vector < Kanal > wektor; void Wczytaj( const char * _plik ); void Zapisz( const char * _plik2 ); void Wypisz() const; };
void Telewizor::Wypisz() const { for( size_t i = 0; i < wektor.size(); ++i ) wektor[ i ].Wyswietl(); }
void Telewizor::Zapisz( const char * _plik2 ) { ofstream plik; plik.open( _plik2, ios::out ); for( size_t i = 0; i < wektor.size(); ++i ) { plik << wektor[ i ].odczyt_kanal() << " " << wektor[ i ].odczyt_nazwa() << wektor[ i ].odczyt_hz() << " "; if( wektor[ i ].odczyt_o() == 0 ) plik << "Informacje."; else if( wektor[ i ].odczyt_o() == 1 ) plik << "Rozrywka."; else if( wektor[ i ].odczyt_o() == 2 ) plik << "Film."; else if( wektor[ i ].odczyt_o() == 3 ) plik << "Muzyka."; else if( wektor[ i ].odczyt_o() == 4 ) plik << "Inne."; } cout << "Zapisano do pliku ..\n"; plik.close(); }
void Telewizor::Wczytaj( const char * _plik ) { ifstream plik2; plik2.open( _plik, ios::in ); int _numer; double _hz; char _nazwa[ 40 ]; Kategoria _o; char O[ 32 ]; if( plik2.good() ) { while( !plik2.eof() ) { plik2 >> _numer; plik2 >> _nazwa; plik2 >> _hz; plik2 >> O; if( strcmp( O, "Informacje." ) == 0 ) _o = Informacje; else if( strcmp( O, "Rozrywka." ) == 0 ) _o = Rozrywka; else if( strcmp( O, "Film." ) == 0 ) _o = Film; else if( strcmp( O, "Muzyka." ) == 0 ) _o = Muzyka; else if( strcmp( O, "Inne." ) == 0 ) _o = Inne; Kanal T( _numer, _nazwa, _hz, _o ); wektor.push_back( T ); } } else cout << "Error .. " << __LINE__ << '\n'; plik2.close(); }
int main( int argc, char * argv[] ) { Telewizor obiekt; obiekt.Wczytaj( "plik.txt" ); obiekt.Wypisz(); return 0; } |
|
GoldWolf |
» 2010-05-12 07:49:25 Spróbuj przeanalizować mój kod mam tam właśnie dostęp do odpowiednich danych w pliku(tego co sam chce odczytać). http://forum.ddt.pl/?Tid=465Niestety kod jest w Borlandzie i możesz mieć problem z jego analizą. |
|
malan |
» 2010-05-12 15:24:02 1. Co to za problem? 2. Spróbuj wyzerować zmienną nazwa (pętlą :)) i użyć strncpy3. Jeżeli punkt 2 nie pomógł daj przykładowe dane, które powinny znaleźć się w pliku. 4. :) |
|
bartek483 Temat założony przez niniejszego użytkownika |
» 2010-05-12 17:26:59 1. Tak jak pisalem, nie moze wczytaj nazwy, choc jak podam mu wiecej niz 1 linie w pliku to kompletnie nic nie odczytuje. 2. Wyzerowanie zmiennej nie pomoglo, funkcja strncpy rowniez. Podaje przykladowa tresc pliku: 01 TVN 65.54 Film. 02 TVN4 45.87 Muzyka. 03 TVP1 54.65 Informacje. |
|
malan |
» 2010-05-12 20:31:20 Jestem w domu ;D (tzn. znalazłem błąd) :). Gotowca Ci nie dam - zapomnij ;). Przeanalizuj sobie funkcję Wczytaj- najlepiej tutaj napisz co się dzieje (po kolei) kiedy program wykonuje funkcję (szczególnie co robi po wyjściu) :). |
|
bartek483 Temat założony przez niniejszego użytkownika |
» 2010-05-12 20:48:38 Zbreakpointowalem i okazalo sie ze desruktor za szybko dziala i usuwa 'nazwe' :D oczywiscie zadzialalo, malan o to Ci chodzilo?;>
PS: Na gotowca nigdy nie oczekuje [; |
|
malan |
» 2010-05-12 21:07:52 Tak :). Wstawiłem do destruktora tekst i zobaczyłem, że trochę za dużo razy się wywołuje :). Temat rozwiązany? ;) |
|
bartek483 Temat założony przez niniejszego użytkownika |
» 2010-05-12 21:15:30 Tak, rozwiazany :) dzieki :) |
|
« 1 » |