Problem z odczytem pliku .txt do tablicy struktur

0

Mam problem z którym nie mogę się uporać. Mianowicie program nie chce mi wczytać danych z pliku txt. Proszę o wszelkie wskazówki.
Kod z pliku naglowkowego:

 #ifndef  baza
#define  baza

#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string>

using namespace std;

struct Osoba
{
	char imie[20];
	char nazwisko[30];
	float ocena;
};

Osoba *WpiszDane(int rozmiar)
{
	Osoba *osoba;
	
	osoba = new Osoba [rozmiar];

	if(osoba == 0)
	{
		cout<<"Nie mozna przydzielic pamieci"<<endl;
		return 0;
	}

	for (int i=0; i<rozmiar; i++)
	{
		cout<<"Wprowadz imie studenta nr "<<i+1<<endl;
		cin>>osoba[i].imie;
		cout<<"Wprowadz nazwisko studenta nr "<<i+1<<endl;
		cin>>osoba[i].nazwisko;
		cout<<"Wprowadz ocene studenta"<<endl;
		cin>>osoba[i].ocena;
	}
	return osoba;
}

void Zapisz(Osoba *osoba, int rozmiar, char *nazwa)
{
	FILE *strumien;
	strumien = fopen (nazwa, "wt");
	for(int i=0; i<rozmiar;i++)
	{
		fprintf(strumien,"%s %s %f\n",osoba[i].imie, osoba[i].nazwisko, osoba[i].ocena);
	}
	fclose(strumien);
}

Osoba *Wczytaj(int rozmiar)
{
	char nazwa[20];
	cout<<"Wpisz nazwe"<<endl;
	cin>>nazwa;
	Osoba *osoba;
	
	osoba = new Osoba [rozmiar];

	FILE*strumien;
	strumien=fopen(nazwa,"r+t");

	int i=0;
	while(!feof(strumien))
	{
		fscanf(strumien,"%s %s %f",osoba[i].imie,osoba[i].nazwisko, osoba[i].ocena);
		i++;
	}

	return osoba;
}

void menu()
{
	cout<<"Menu:\n";
	cout<<"1. Wprowadz dane studentow"<<endl;
	cout<<"2. Wyswietl dane studentow"<<endl;
	cout<<"3. Osoba z najgorsza ocena"<<endl;
	cout<<"4. Osoba z najlepsza ocena"<<endl;
	cout<<"5. Zapisz do pliku"<<endl;
}




#endif

A tutaj kod z pliku main:

#include "naglowki.h"

Osoba *wsk;
int rozmiar;
int main()
{
	char n;
	for(;;)
	{
	menu();
	cin>>n;
	system("cls");
	switch (n)
	{
		case '1':
	{
			if(wsk!=0)
	{
		delete [] wsk;
	}
			cout<<"Ile osob chcesz wprowadzic>?"<<endl;
			cin>>rozmiar;
			
			wsk=WpiszDane(rozmiar);
			break;
	}
		case '2':
			{
				for(int i=0; i<rozmiar; i++)
				{
					cout<<"Dane studenta nr:"<<i+1<<endl;
					cout<<wsk[i].imie<<endl<<wsk[i].nazwisko<<endl<<"Ocena: "<<wsk[i].ocena<<endl;
				}
				break;
			}
		case '3':
			{
				Osoba min;
				min=wsk[0];
				for (int i=0;i<rozmiar;i++)
				{
					if (wsk[0].ocena > wsk[i].ocena)
					{
						min = wsk[i];
					}

				}
				cout<<"Osoba z najgorsza ocena ("<<min.ocena<<") to "<<min.imie<<" "<<min.nazwisko<<endl;
				break;
			}
		case '4':
			{
				Osoba max;
				max=wsk[0];
				for (int i=0;i<rozmiar;i++)
				{
					if(wsk[0].ocena < wsk[i].ocena)
					{
						max=wsk[i];
					}
				}
				cout<<"Osoba z najlepsza ocena ("<<max.ocena<<") to "<<max.imie<<" "<<max.nazwisko<<endl;
				break;
			}
		case '5':
			{
				char nazwa1[20];
				cout<<"Podaj nazwe pliku"<<endl;
				cin>>nazwa1;
				Zapisz(wsk,rozmiar,nazwa1);
				break;
			}
		case '6':
			{
				wsk=Wczytaj(rozmiar);
				break;
			}
	}
}
} 

Z góry dziękuję za każdą pomoc

0

takie uwagi do samego wczytywania:
0. nazwa ma maly rozmiar. 255 znakow na przechowanie nazwy pliku powinno byc wystarczajace

  1. strumien=fopen(nazwa,"r"); // zwykle otwarcie pliku do odczytu jako tekst
  2. if (strumien==NULL) { printf("Wystapil blad. plik nie istnieje lub brak dostepu!\n"); return NULL; } // to sobie zeedytuj w miare potrzeb
  3. jak wczytujesz plik to nie wiesz ile osob jest w srodku, wiec powinienes wczytywac tak dlugo az nie skonczy sie plik, a zwracac rozmiar i dane. chyba ze wiesz ile jest osob i wiesz ze nie wystapi zaden blad.
  4. nie znasz dzialania scanf:

fscanf(strumien,"%s%s%f",osoba[i].imie,osoba[i].nazwisko, osoba[i].ocena); // nie powinno byc spacji miedzy %s%s%f chyba ze jestes w 100% pewien ze jest tam ta spacja, a nie np enter lub tabulator

poza tym lepiej sprawdzic czy fscanf dal rade odczytac:

int i;
for(i=0; fscanf(strumien,"%s%s%f",osoba[i].imie,osoba[i].nazwisko, osoba[i].ocena)==3; i++) // 3 - ilosc elementow odczytywanych
{
//nic
}

if (i!=rozmiar)
{
printf("Ilosc elementow nie zgadza sie z oczekiwana!\n");
delete [] osoba;
osoba = NULL;
}
5. Nie zamykasz pliku! niezamkniety plik czesto powoduje pozniej problemy z jego otwieraniem:
fclose(strumien);
return osoba;

0

Super, dzięki za pomoc. Zmodyfikowałem program, teraz po wprowadzeniu odpowiedniego rozmiaru wczytuje mi dane. Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1