[C++] Tworzenie obiektów struktury przez wskaźnik
Ostatnio zmodyfikowano 2016-05-17 20:09
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!!! #include<iostream> #include<conio.h> #include<string> #include<fstream>
using namespace std;
struct student { char imie[ 20 ]; string nazwisko[ 20 ]; int wiek; };
int main() { student arek; student * ptr; ptr = & arek; cout << "Podaj Imie: "; cin >> ptr->imie; cout << "Imie arka: " << ptr->imie << endl; int ilosc; cout << "podaj ile obiektow struktury student utworzyc? "; while( !( cin >> ilosc ) ) { cin.clear(); cin.sync(); cout << "wprowadzony zły typ danych. Wprowadz ponownie\n"; } student * wsk; wsk = new student[ ilosc ]; fstream plik; plik.open( "strukturastudent.txt", ios::out ); for( int i = 1; i <= 1; i++ ) { cout << "\nobiekt o numerze " << i << endl; cout << "podaj imie "; 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(); }
|
|
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. |
|
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ę! |
|
« 1 » |