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

[C++] Tworzenie obiektów struktury przez wskaźnik

Ostatnio zmodyfikowano 2016-05-17 20:09
Autor Wiadomość
diglet
Temat założony przez niniejszego użytkownika
[C++] Tworzenie obiektów struktury przez wskaźnik
» 2016-05-17 19:38:41
Cześć,
program działa w oparciu o prostą strukturę student. Po wprowadzeniu ilości obiektów struktury student do utworzenia rezerwujemy dynamicznie miejsce w pamięci operatorem new. Następnie każdy z składników kolejnych obiektów tej struktury wypełniamy danymi, zapisujemy do pliku a na koniec odczytujemy z niego i wypisujemy na ekran I tu jest problem. Mianowicie chodzi o miejsce gdzie mamy wpisać do danego obiektu imię. Nie udaje się tego zrobić. Wskaźnik traktuje tablicę znaków char imie[20] jako po prostu pojedynczy obiekt typu char. W efekcie tego po zażądaniu wpisania imienia np. Marcin i zatwierdzeniu enterem, w składniku imie znajdzie się literka M, natomiast w stringu nazwisku dalsza część wpisanego tekstu tj. arcin. Nie dostajemy przy tym szansy na wpisanie czegokolwiek do stringu nazwisko. Po prostu tą jedną operacją wpisania wpisujemy do obiektów imie i do nazwisko. Przyczyną tego jest to, że przez wskaźnik składnik imie jest traktowany jako pojedynczy char. Co ciekawe dzieje się tak tylko przy dynamicznie utworzonych obiektach operatorem new. Jeśli utworzymy statycznie obiekt tej struktury- wszystko działa jak należy. Całość w Visual Studio 2013. POMOCY!!!
C/C++
#include<iostream>
#include<conio.h>
#include<string>
#include<fstream>


using namespace std;

struct student
{
    char imie[ 20 ];
    string nazwisko[ 20 ];
    int wiek;
};

int main()
{
    //Na poczattek - zrobione to statycznie- o dziwo dziala
    student arek;
    student * ptr;
    ptr = & arek;
    cout << "Podaj Imie: ";
    cin >> ptr->imie;
    cout << "Imie arka: " << ptr->imie << endl;
   
   
    //teraz to samo dynamicznie
    int ilosc;
    cout << "podaj ile obiektow struktury student utworzyc? ";
   
    while( !( cin >> ilosc ) ) //zabezpieczenie przed zlym typem danych
    {
        cin.clear();
        cin.sync();
        cout << "wprowadzony zły typ danych. Wprowadz ponownie\n";
    }
   
   
    student * wsk;
    wsk = new student[ ilosc ];
   
    //ponizej- utworzenie pliku
    fstream plik;
    plik.open( "strukturastudent.txt", ios::out );
   
    for( int i = 1; i <= 1; i++ )
    {
        cout << "\nobiekt o numerze " << i << endl;
       
       
        cout << "podaj imie "; //problem lezy w 3 ponizszych linijkach
        cin >> * wsk->imie;
        plik << * wsk->imie << endl;
       
        cout << "podaj nazwisko ";
        cin >> * wsk->nazwisko;
        plik << * wsk->nazwisko << endl;
       
        cout << "podaj wiek ";
        cin >> wsk->wiek;
        plik << wsk->wiek << endl << endl;
        wsk++;
       
    }
    plik.close();
   
    cout << "\nWyswietlam dane z pliku tekstowego" << endl;
    plik.open( "strukturastudent.txt", ios::in );
    for( int i = 1; i <= ilosc * 4; i++ )
    {
        int nr_linii = 1;
        string linia;
        getline( plik, linia );
        cout << linia << endl;
    }
   
   
    _getch();
}
P-148341
michal11
» 2016-05-17 19:47:31
Dlatego, że tu:
cin >> * wsk->imie;
 używasz gwiazdki czyli dereferencji na tablicy imię, dlatego wczytujesz tylko jeden, zerowy, element do tej tablicy.
Na pewno w strukturze student potrzebna ci jest tablica aż 20 elementów typu string na nazwiska ?
I pamięć to ty zwalniaj bo masz wycieki.
P-148343
diglet
Temat założony przez niniejszego użytkownika
» 2016-05-17 20:09:06
Ajajaj! No tak, a popatrz robiłem to przed chwilą i nie wiedzieć czemu nie działało. Dziekuję!
P-148345
« 1 »
  Strona 1 z 1