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

Klasy - odczyt z pliku

Ostatnio zmodyfikowano 2017-03-05 21:53
Autor Wiadomość
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.

C/C++
#include <iostream>
#include <fstream>

using namespace std;










class Wektor
{
private:
    int wielkosc;
   
   
    float * tablica;
public:
    Wektor( int wielkosc1 ); //konstruktor
    ~Wektor(); //destruktor
    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 ]; //bez deklaracji , poniewaz jest juz zadeklarowana w klasie a konsturktor ma dostep
    wielkosc = wielkosc1; //przypisujemy wartosc z klasy do wartosci w tej funkcji ( w funkcji tylko uyzywa sie zmiennych ktore uzywaja sie w tej)
   
}
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;
        }
    }
}
P-158586
maly7
» 2017-03-05 16:40:08
Dobrze zrozumiałem problem? Po prostu nie wczytuje danych?

C/C++
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ć.
P-158592
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.
P-158596
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.
P-158601
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
C/C++
#include <iostream>
#include <fstream>

using namespace std;










class Wektor
{
private:
    int wielkosc;
   
   
    float * tablica;
    float * tablica1;
public:
    WektorOd( int wielkosc ); //konstruktor2
    Wektor( int wielkosc ); //konstruktor
    ~Wektor();
    //destruktor
    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 ]; //bez deklaracji , poniewaz jest juz zadeklarowana w klasie a konsturktor ma dostep
    wielkosc = wielkosc1; //przypisujemy wartosc z klasy do wartosci w tej funkcji ( w funkcji tylko uyzywa sie zmiennych ktore uzywaja sie w tej)
   
}

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;
        }
    }
}
P-158609
« 1 »
  Strona 1 z 1