Projekt struktury zapisywane do pliku.

0

Witam.
Mam do zrobienia projekt 3 struktury : pacjent, lekarz, porada. Program am zapisywać je do pliku i z niego wczytywać a także mieć możliwość edycji danych w pliku. Napisałem już cześć kodu (bez opcji modyfikacji) lecz mój program źle czyta dane z plików i się wiesza przy odczycie. Prosiłbym o wykrycie błędów a także powiedzenie jak napisać żeby program wyświetlał cała zawartość pliku a nie tylko tyle ile wybierze użytkownik.

Oto kod:

 
#include <iostream>
#include <stdio.h>
#include <fstream>

using namespace std;


struct pacjent
{
int id;
char Imie[10];
char Nazwisko[20];
int Urodzony;
};

struct lekarz
{
int id;
char Imie[10];
char Nazwisko[20];
long int Nrtel;
};

struct porada
{
int idPacjent;
int idLekarz;
char data[10];
};

void NowyPacjent()
{
int m;
cout<<"Podaj liczbe pacjentow, ktorych chcesz dodac do bazy: ";
cin>>m;

pacjent *tablica = new pacjent[m];

for(int i = 0 ; i < m; i++)
{
ofstream file;
file.open("baza_pacjentow.dat",ios::out | ios::app | ios::binary);
cout<<"----------Wprowadzenie danych pacjentow.----------\n";
cout<<"ID: \n";
cin>>tablica[i].id;
cout<<"Imie: \n";
cin>>tablica[i].Imie;
cout<<"Nazwisko: \n";
cin>>tablica[i].Nazwisko;
cout<<"Data urodzenia: \n";
cin>>tablica[i].Urodzony;
file.write ((char*) &tablica[i], sizeof(pacjent));
file.close();
}

	
}

void NowyLekarz()
{
     int m;
     cout<<"Podaj liczbe lekarzy, ktorych chcesz dodac do bazy: ";
     cin >>m;
     
    lekarz *tablica = new lekarz[m];
     
     for(int i = 0; i < m; i++)
     {
         ofstream file;
         file.open("baza_lekarzy.dat", ios::out | ios::app | ios::binary);
         cout<<"----------Wprowadzenie danych lekarzy.----------\n";
         cout<<"ID: \n";
         cin>>tablica[i].id;
         cout<<"Imie: \n";
         cin>>tablica[i].Imie;
         cout<<"Nazwisko: \n";
         cin>>tablica[i].Nazwisko;
         cout<<"Numer telefonu: \n";
         cin>>tablica[i].Nrtel;
         file.write((char*) &tablica[i], sizeof(lekarz));
         file.close();
     }
     
     

}

void NowyPorada()
{
     int m;
     cout<<"Podaj liczbe porad, ktorych chcesz dodac do bazy: ";
     cin >>m;

     porada *tablica = new porada[m];
     
     for(int i = 0; i < m; i++)
     {
         ofstream file;
         file.open("baza_porad.dat", ios::out | ios::app | ios::binary);
         cout<<"----------Wprowadzenie danych porady.----------\n";
         cout<<"ID Pacjenta: \n";
         cin>>tablica[i].idPacjent;
         cout<<"ID Lekarza: \n";
         cin>>tablica[i].idLekarz;
         cout<<"Data konsultacji: \n";
         cin>>tablica[i].data;
         file.write((char*) &tablica[i], sizeof(porada));
         file.close();
         }
}

void OdczytPacjent()
{
     int m;
     cin>>m;
	 pacjent *tablica = new pacjent[m];
     cout << "Wyswietlanie bazy pacjentow." << endl << endl ;
     for(int i=1;i<=m;i++)
     {
     ifstream file("baza_pacjentow.dat",ios::in | ios::binary);
     file.read((char*) &tablica[i], sizeof(pacjent)); // wczytuje z pliku do tablicy struktur
     cout << "Id pacjenta: " << tablica[i].id << endl;
     cout << "Imie: " << tablica[i].Imie << endl;
     cout << "Nazwisko: " << tablica[i].Nazwisko << endl;
     cout << "Data urodzenia: " << tablica[i].Urodzony << endl;
     file.close();
     }
     
}

void OdczytLekarz()
{
	int m;
     cin>>m;
	 lekarz *tablica = new lekarz[m];

     cout << "Wyswietlanie bazy lekarzy." << endl << endl ;
     for(int i=1;i<=m;i++)
     {
     ifstream file("baza_lekarzy.dat",ios::in | ios::binary);
     file.read((char*) &tablica[i], sizeof(lekarz)); // wczytuje z pliku do tablicy struktur
     cout << "Id pacjenta: " << tablica[i].id << endl;
     cout << "Imie: " << tablica[i].Imie << endl;
     cout << "Nazwisko: " << tablica[i].Nazwisko << endl;
     cout << "Numer telefonu: " << tablica[i].Nrtel << endl;
     file.close();
     }
     
}

void OdczytPorada()
{
	int m;
     cin>>m;
	 porada *tablica = new porada[m];

     cout << "Wyswietlanie bazy porad." << endl << endl ;
     for(int i=1;i<=m;i++)
     {
     ifstream file("baza_lekarzy.dat",ios::in | ios::binary);
     file.read((char*) &tablica[i], sizeof(porada)); // wczytuje z pliku do tablicy struktur
	 cout << "Id pacjenta: " << tablica[i].idPacjent << endl;
	 cout << "Id lekarza: " << tablica[i].data << endl;
     cout << "Data: " << tablica[i].data << endl;
     file.close();
     }
     
}

void ModPacjent()
{

}

void ModLekarz()
{

}

void ModPorada()
{

}
int main ()
{	
	int n;
	printf("***********Przetwarzanie danych pogrupowanych w struktury***********\n");
	printf("Co chcesz zrobic:\n1.Zapisac dane do bazy.\n2.Odczytac dane z bazy.\n3.Zmodyfikowac baze.\n4.Zabaczyc liste pacjentow podanego lekarza.\n");
	again:
	scanf("%i", &n);

	switch(n)
	{
		case 1:
             {
                    int n;
                    cout<<"Co chcesz dodac?\n1.Pacjenta\n2.Lekarza\n3.Porade.\n";
                    again1:
                    cin>>n;
                    switch(n)
                    {
                             case 1:
                                  NowyPacjent();
                                  break;
                             case 2:
                                  NowyLekarz();
                                  break;
                             case 3:
                                  NowyPorada();
                                  break;
                             default:
                                     cout<<"Wybrano nieistniejaca opcje wybierz ponownie";
                                     goto again1;              
                    }
                    break;       
             }
		case 2:
             {
                    int n;
                    cout<<"Ktora baze danych chcesz odczytac?\n1.Pacjentow\n2.Lekarzy\n3.Porad.\n";
                    again2:
                    cin>>n;
                    switch(n)
                    {
                             case 1:
                                  OdczytPacjent();
                                  break;
                             case 2:
                                  OdczytLekarz();
                                  break;
                             case 3:
                                  OdczytPorada();
                                  break;
                             default:
                                     cout<<"Wybrano nieistniejaca opcje wybierz ponownie";
                                     goto again2;              
                    }
                    break;       
             }
        case 3:
             {
                    int n;
                    cout<<"Ktora baze danych chcesz zmodyfikowac?\n1.Pacjentow\n2.Lekarzy\n3.Porad.\n";
                    again3:
                    cin>>n;
                    switch(n)
                    {
                             case 1:
                                  ModPacjent();
                                  break;
                             case 2:
                                  ModLekarz();
                                  break;
                             case 3:
                                  ModPorada();
                                  break;
                             default:
                                     cout<<"Wybrano nieistniejaca opcje wybierz ponownie";
                                     goto again3;              
                    }
                    break;       
             }
		
		case 4:

			break;
		default:
			printf("Wybrano nieistniejaca opcje wybierz ponownie:");
			goto again;
	}


	

system("pause");	
return 0;
}

0

Po pierwsze: nie używamy etykiet, no chyba że w naprawdę uzasadnionych przypadkach. Tutaj można bezproblemowo sobie poradzić strukturalnie.

Drugie: W funkcjach czytających/zapisujących alokujesz pamięć, ale jej nie zwalniasz.

I przechodząc do meritum, czyli dlaczego "nie działa":
Funkcje odczytujące mają iterator pętli od 1 do n.
Ponadto, za każdym przejściem pętli od nowa otwierasz plik i za każdym razem czytasz pierwszy rekord.

A odczyt wszystkich rekordów można łatwo zrealizować, określając wielkość pliku a następnie dzieląc ją przez sizeof struktury.

0

Dodałem usuwanie tablic. Poprawiłem pętle zrobiłem od 0 do n -1. Wiem jak sprawdzić długość pliku ale o co dokładnie chodzi z podzieleniem przez wielkość struktury ... domyślam się ze otrzymam wtedy liczbę struktur w pliku czyli liczbę obrotów pętli odczytującej. Czy dobrze rozumuje? Mógłbyś mi przybliżyć chociaż trochę jaki błąd popełniam przez który caly czas czytam pierwszy element zamiast kolejnych....

0

Co do określania ilości struktur dobrze rozumujesz :)
Natomiast kwestia odczytu z pliku: zamiast za każdym razem otwierać plik przy każdym przejściu pętli, powinno się go otworzyć raz i zamknąć też raz, po wszystkich operacjach odczytu. Na przykładzie fragmentu Twojego kodu:

	ifstream file("baza_pacjentow.dat",ios::in | ios::binary);
	for(int i=0; i<m; i++)
	{
		file.read((char*) &tablica[i], sizeof(pacjent));
		cout << "Id pacjenta: " << tablica[i].id << endl;
		cout << "Imie: " << tablica[i].Imie << endl;
		cout << "Nazwisko: " << tablica[i].Nazwisko << endl;
		cout << "Data urodzenia: " << tablica[i].Urodzony << endl;	
	}
	file.close();

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