baza danych i problem z odczytem fread

0

witam,
Mialem napisac program w c++ w ktorym mozna wpisywac dane osob (imie, nazwisko, wiek), sortowac te osoby wedlug wieku zapisywac i odczytywac te dane za pomoca fwrite i fread. No i tu wlasnie pojawil sie problem, bo zapis fwritem dziala, a odczyt nie. Prosze o pomoc :) i napisanie w czym problem i co nalezy zmienic, zeby to jakos dzialalo.

Ponizej kod programu w C++ pisalem go pod windowsem, w kompilatorze CODE BLOCKS :)

#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;

struct osoby
{
char imie[20];
char nazwisko[20];
char wiek[3];
};
osoby dane[100];
int main()

{

int wybor=0 ;
int ile =0 ;

while (wybor!=7)
{
system("cls");
cout<<"UWAGA !! PROGRAM OBSLUGUJE BAZE DANYCH O MAX 100 OSOBACH"<<endl<<endl;
cout<<"Menu:"<<endl<<endl;
cout<<"1. Dodaj osobe"<<endl;
cout<<"2. Wypisz osoby"<<endl;
cout<<"3. Posortuj osoby od najmlodszej do najstarszej"<<endl;
cout<<"4. Usun osobe"<<endl;
cout<<"5. Zapisz "<<endl;
cout<<"6. Wczytaj dane z pliku"<<endl;
cout<<"7. Wyjdz"<<endl<<endl;
cout<<"Wybor: ";
cin>>wybor;

switch (wybor)
{
case 1:
if(ile<100)
{
system("cls");
cout << "Wprowadzanie danych "<< endl;
cout << "Podaj imie: " << endl;
cin >> dane[ile].imie;
cout << "Podaj nazwisko: " << endl;
cin >> dane[ile].nazwisko;
cout << "Podaj wiek: " << endl;
cin >> dane[ile].wiek;
ile++;
}
else cout<<" BRAK MIEJSCA !!!!"<<endl;
break;

case 2:
system("cls");
cout << "Wprowadzone osoby:" << endl;
cout << " " << endl;
 for(int i =0; i<ile;i++)
      {
          cout << dane[i].imie<<" "<<dane[i].nazwisko<< " " << dane[i].wiek << " lat."<< endl;
      }
getch();

break;


case 3:
	system("cls");
	cout << "Osoby od najmlodszej do najstarszej:" << endl;
cout << " " << endl;

	osoby temp;
	for(int i = 0;i<ile;i++)
	{
		for(int j= 0; j<ile-1;j++)
		{
			if(dane[j].wiek>dane[j+1].wiek)
			{
				temp=dane[j+1];
				dane[j+1]=dane[j];
				dane[j]=temp;

			}
		}

	}
   for(int i =0; i<ile;i++)
      {
          cout <<i+1<<".  "<< dane[i].imie<<" "<<dane[i].nazwisko<< " " << dane[i].wiek << " lat"<< endl;
      }



getch();
break;

case 4:
	system("cls");
	cout<<"Wszystkie pozycje w bazie : "<<endl;
	for(int i =0; i<ile;i++)
      {
          cout <<i+1<<".  "<< dane[i].imie<<" "<<dane[i].nazwisko<< " " << dane[i].wiek << " lat"<< endl;
      }
	int pozycja;
	cout<<"Ktory wpis chcesz usunac (0 = nie usuwam): ";
	cin>>pozycja;
	if(pozycja !=0)
	{
		for(int i = pozycja-1;i<ile;i++)
		{
			dane[i]=dane[i+1];
		}
		ile--;

	}
	break;
case 5:
system("cls");
FILE *zapis;
zapis=fopen("baza_danych.dat","wb");
fwrite(dane,sizeof(struct osoby),ile,zapis);
fclose(zapis);
cout<<"Zapisano do pliku";
getch();
break;

case 6:
system("cls");
FILE *wczyt;
wczyt=fopen("baza_danych.dat","rb");
fread(dane,sizeof(struct osoby),ile,wczyt);
fclose(wczyt);
cout<<"Wczytano dane z pliku";
getch();
break;
}
}



return 0;

}
0
struct osoby
{
char imie[20];
char nazwisko[20];
char wiek[3];
};

nie "osoby", bo to jest jedna osoba.

osoby dane[100];
jakie dane? ta właśnie tablica powinna się nazywać "osoby", "tablica_osob", albo jakoś podobnie:

struct Osoba {
...
};

Osoba osoby[100];
#include <iostream>
#include <stdio.h>

jeśli używasz nagłówków z biblioteki STL (jak iostream) to należy się tego trzymać, i zamiast <stdio.h> daj <cstdio>. Mieszanie ich powoduje czasem dziwne problemy. (conio.h i windows.h muszą tak zostać, bo nie mają odpowiedników "bez .h")

fread(dane,sizeof(struct osoby),ile,wczyt);
'ile' w tym momencie wynosi 0, albo jest w ogóle nieokreślone. zamiast tego podajesz maksymalną liczbę, którą jesteś gotów odczytać (100, bo tyle ma tablica). za to fread zwraca ci ilość elementów które faktycznie odczytano:

ile = fread(dane,sizeof(struct osoby),100,wczyt);
0

wielkie dzieki :)
Mam jeszcze jeden problem ..
w casie 3 (linia 67) mam sortowanie bąbelkowe wedlug wieku

 case 3:
        system("cls");
        cout << "Osoby od najmlodszej do najstarszej:" << endl;
cout << " " << endl;
 
        osoby temp;
        for(int i = 0;i<ile;i++)
        {
                for(int j= 0; j<ile-1;j++)
                {
                        if(dane[j].wiek>dane[j+1].wiek)
                        {
                                temp=dane[j+1];
                                dane[j+1]=dane[j];
                                dane[j]=temp;
 
                        }
                }
 
        }
   for(int i =0; i<ile;i++)
      {
          cout <<i+1<<".  "<< dane[i].imie<<" "<<dane[i].nazwisko<< " " << dane[i].wiek << " lat"<< endl;
      }
 
 
 
getch();
break;

jesli w stukturze mam okreslony wiek jako int wtedy sortowanie dziala, ale w zapisie i przy odczycie wylatuje zly wiek, natomiast jesli mam char wiek [3] wtedy zapis i odczyt dziala, ale sortowanie nie dziala

0

Bo porównywanie char* robi sie za pomocą strcmp() a nie za pomocą operatorów < i >

0

Zapis liczby w trybie binarnym oznacza że nie zobaczysz tej liczby w postaci tekstowej w pliku.

0

Dziękuje Wam wszystkim za pomoc :) Dzięki Waszym wskazówkom program dziala w calości :)

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