Klasy - odczyt z pliku
Ostatnio zmodyfikowano 2017-03-05 21:53
Mashnar Temat założony przez niniejszego użytkownika |
Klasy - odczyt z pliku » 2017-03-05 14:08:51 Witam.Mam problem z odczytanie z pliku danych ( w tym przypadku wektor).Działa to na klasach , i mam pewien problem , ponieważ jak odczytuje z tego pliku to mi wyskakuje adres komórki w 16 a nie dana liczba ( tak mi sie wydaje). Jeszcze nie miałem pomysłu jak to zrobić , aby sam odczytywał liczbe tych elementów , ale narazie chciałem ze z "palca wpisuje". W pliku tekstowym w 1 lini jest liczba elementów tego wektora , a w 2 linijce wartosci tego. Prosiłbym o pomoc , wytłumaczenie. Oto kod. #include <iostream> #include <fstream>
using namespace std;
class Wektor { private: int wielkosc; float * tablica; public: Wektor( int wielkosc1 ); ~Wektor(); void Ustaw( int pozycja, float wartosc ); float Pobierz( int pozycja ) { return tablica[ pozycja ]; } void wyswietl(); void zapis(); void odczyt( int wielkosc ); }; Wektor::Wektor( int wielkosc1 ) { cout << "Konstruktor" << endl; tablica = new float[ wielkosc1 ]; wielkosc = wielkosc1; } Wektor::~Wektor() { cout << "Destruktor" << endl; delete[] tablica; } void Wektor::Ustaw( int pozycja, float wartosc ) { if(( wielkosc > pozycja ) &&( pozycja >= 0 ) ) { tablica[ pozycja ] = wartosc; } } void Wektor::wyswietl() { cout << "("; for( int i = 0; i < wielkosc; i++ ) { cout << tablica[ i ]; if( i != wielkosc - 1 ) { cout << " ,"; } } cout << ")"; } void Wektor::zapis() { ofstream plik; plik.open( "test.txt" ); plik << wielkosc << endl; for( int i = 0; i < wielkosc; i++ ) { plik << tablica[ i ] << " "; } plik.close(); }
void Wektor::odczyt( int wielkosc ) { ifstream plik; plik.open( "test.txt" ); plik >> wielkosc; int * tab = new int[ wielkosc ]; for( int i = 0; i < wielkosc; i++ ) { plik >> tab[ i ]; } plik.close(); } int main() { int x; int rozmiar; float wartosc; cout << "Co chcesz zrobic?" << endl; cout << "1 - Zapis do pliku" << endl; cout << "2 - Odczyt z pliku" << endl; cin >> x; switch( x ) { case 1: { cout << "Podaj rozmiar wektora" << endl; cin >> rozmiar; Wektor * pwektor2 = new Wektor( rozmiar ); for( int i = 0; i < rozmiar; i++ ) { cout << "Podaj wartosc wektora nr" << "[" << i + 1 << "]"; cin >> wartosc; pwektor2->Ustaw( i, wartosc ); } pwektor2->zapis(); pwektor2->wyswietl(); delete pwektor2; break; } case 2: { cout << "Podaj rozmiar wektora" << endl; cin >> rozmiar; Wektor * pwektor2 = new Wektor( rozmiar ); cout << "Program teraz odczyta z pliku wartosc" << endl; pwektor2->odczyt( rozmiar ); pwektor2->wyswietl(); delete pwektor2; break; } } }
|
|
maly7 |
» 2017-03-05 16:40:08 Dobrze zrozumiałem problem? Po prostu nie wczytuje danych? void Wektor::odczyt( int wielkosc ) { ifstream plik; plik.open( "test.txt" ); plik >> wielkosc; int * tab = new int[ wielkosc ]; for( int i = 0; i < wielkosc; i++ ) { plik >> tab[ i ]; } plik.close(); } W tej metodzie wczytujesz dane do tablicy dynamicznej tab, ale co później z nią robisz? Musisz ją gdzieś "przekopiować", żeby elementy zostały gdzieś zapisane. A zmienna wielkość nie zostanie zmieniona po wyjściu z metody, żeby tak było, musisz przekazać jako argument wskaźnik albo referencję. Z resztą jeśli zmienna wielkość istnieje w tej klasie to nie musisz jej przekazywać już jako argument, wystarczy się do niej odwołać. |
|
Mashnar Temat założony przez niniejszego użytkownika |
» 2017-03-05 18:17:55 Hm...Tzn coś sie dzieje , może wkleje tutaj zrzut co sie dzieje jak wywołam ta funkcje odczyt https://gyazo.com/5a07fd0c473e10afe7b8d5bfa3d060a6
Nie odczytuje mi poporstu tych wartosc , ale to co widac. |
|
carlosmay |
» 2017-03-05 20:18:31 int * tab = new int[ wielkosc ]; |
Ta tablica jest deklarowana lokalnie i wczytane do niej dane giną wraz z nią przy opuszczaniu metody (BTW: wyciek pamięci bo nie ma zwolnienia tej pamięci). Wypisujesz przypadkowe wartości z pamięci. |
|
Mashnar Temat założony przez niniejszego użytkownika |
» 2017-03-05 21:53:46 Ok.Pomogło. ;) dziękuje , wstawiam kod moze ktos skorzysta #include <iostream> #include <fstream>
using namespace std;
class Wektor { private: int wielkosc; float * tablica; float * tablica1; public: WektorOd( int wielkosc ); Wektor( int wielkosc ); ~Wektor(); void Ustaw( int pozycja, float wartosc ); float Pobierz( int pozycja ) { return tablica[ pozycja ]; } void wyswietl(); void zapis(); void odczyt( int wielkosc ); }; Wektor::Wektor( int wielkosc1 ) { cout << "Konstruktor" << endl; tablica = new float[ wielkosc1 ]; wielkosc = wielkosc1; }
Wektor::~Wektor() { cout << "Destruktor1" << endl; delete[] tablica; }
void Wektor::Ustaw( int pozycja, float wartosc ) { if(( wielkosc > pozycja ) &&( pozycja >= 0 ) ) { tablica[ pozycja ] = wartosc; } } void Wektor::wyswietl() { cout << "("; for( int i = 0; i < wielkosc; i++ ) { cout << tablica[ i ]; if( i != wielkosc - 1 ) { cout << " ,"; } } cout << ")"; } void Wektor::zapis() { ofstream plik; plik.open( "test.txt" ); plik << wielkosc << endl; for( int i = 0; i < wielkosc; i++ ) { plik << tablica[ i ] << " "; } plik.close(); }
void Wektor::odczyt( int wielkosc2 ) { ifstream plik; plik.open( "test.txt" ); plik >> wielkosc2; for( int i = 0; i < wielkosc2; i++ ) { plik >> tablica[ i ]; } plik.close(); } int main() { int x; int rozmiar; float wartosc; cout << "Co chcesz zrobic?" << endl; cout << "1 - Zapis do pliku" << endl; cout << "2 - Odczyt z pliku" << endl; cin >> x; switch( x ) { case 1: { cout << "Podaj rozmiar wektora" << endl; cin >> rozmiar; Wektor * pwektor2 = new Wektor( rozmiar ); for( int i = 0; i < rozmiar; i++ ) { cout << "Podaj wartosc wektora nr" << "[" << i + 1 << "]"; cin >> wartosc; pwektor2->Ustaw( i, wartosc ); } pwektor2->zapis(); pwektor2->wyswietl(); delete pwektor2; break; } case 2: { cout << "Podaj rozmiar wektora" << endl; cin >> rozmiar; Wektor * pwektor2 = new Wektor( rozmiar ); cout << "Program teraz odczyta z pliku wartosc" << endl; pwektor2->odczyt( rozmiar ); pwektor2->wyswietl(); delete pwektor2; break; } } }
|
|
« 1 » |