[C] Struct + zapis i odczyt z pliku

0

Witam, mam takie zadanie :

Założyć rejestr operacji na kontach bankowych (plik struktur, plik dyskowy bank.dat). O każdej operacji bankowej mają być pamiętane następujące informacje: nr konta, data wykonanej operacji, kwota operacji.
Wyprowadzić informacje o operacjach dla danego numeru konta (numer czytany z klawiatury) w maju 2005 roku.

Ma to byc w ANSI C. Robię tak:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>


 struct konta{
  int nr_konta;
  int _rok,_dzien,_miesiac;
  double kwota;
 };

 void zapisz();
 void odczyt(int n);

void zapisz(){
      FILE *plik;
      struct konta rec;
      long lc;  
      
      plik = fopen("konta.txt","w");
        system("CLS");

      printf("\nLiczba rekordw %5.0lf ",lc);
      printf("\nNumer konta : ");
      scanf("%d",&rec.nr_konta);
      printf("Data operacja ( dzien miesiac rok ) : ");
      scanf("%d%d%d",&rec._dzien,&rec._miesiac,&rec._rok);
      printf("Kwota operacji : ");
      scanf("%lf",&rec.kwota);
      
  
      fwrite(&rec,sizeof(rec),1,plik);

      fclose(plik);
      printf("\n Zapisano do pliku...");
      getch();
      }



void odczyt(int n){
      FILE *plik;
      struct konta rec;
      long k;
      
      plik = fopen("napisy.txt","r+b");
      fseek(plik,1,0);

      fread(&rec,sizeof(rec),1,plik);

      printf("Numer konta : %d ",rec.nr_konta);
      printf("Kwota       : %d ",rec.kwota);
      fclose(plik);
      getch();
      }

I do pliku zapisuje tylko i wyłącznie JEDEN rekord. Natomiast przy probie odczytu program sie wykrzacza :/ W Pascalu/delphi nie mam z takimi rzeczami problemu, ale jezeli chodzi o C/C++ to jest bida :/ Czytalem jakies kursy itd ale nadal to samo :/
Moglby mi ktos pomoc ? Kompilator to DEV C++

0

Poprawiłem trochę programik powinien już działać lepiej.
Poprawiłem tylko tak aby poprawnie zapisywał ten jeden rekord i go odczytywał.
Natomiast jeśli to ma być jakaś większa baza polecam "Liste" której implementacje zamieściłem troche pozycji niżej, może ci się przydać.

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

 struct konta{
  int nr_konta;
  int _rok,_dzien,_miesiac;
  double kwota;
 };

 void zapisz();
 void odczyt(int n);
int main(void)
{
    zapisz();
    system("pause");
    odczyt(1);
    system("pause");
}

void zapisz(){
      FILE *plik;
      struct konta rec;
      long lc =0;  
      
      plik = fopen("konta.txt","wb");
        system("CLS");

      printf("\nLiczba rekordw %5.0ld ",lc);
      printf("\nNumer konta : ");
      scanf("%d",&rec.nr_konta);
      printf("Data operacja ( dzien miesiac rok ) : ");
      scanf("%d%d%d",&rec._dzien,&rec._miesiac,&rec._rok);
      printf("Kwota operacji : ");
      scanf("%ld",&rec.kwota);
      
  
      fwrite(&rec,sizeof(rec),1,plik);

      fclose(plik);
      printf("\n Zapisano do pliku...");
      getch();
      }

void odczyt(int n){
      FILE *plik;
      struct konta rec;
      long k;
      
      plik = fopen("konta.txt","r+b");
      fseek(plik,0,SEEK_SET);

      fread(&rec,sizeof(rec),1,plik);

      printf("Numer konta : %d ",rec.nr_konta);
      printf("Kwota       : %d ",rec.kwota);
      fclose(plik);
      getch();
      }
0

Ok, zrobione.

// program nr 27
// napisane w Dev-C++ 4.9.9.2

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

//-----------------------------
 struct konta{
  int nr_konta;
  int _rok,_dzien,_miesiac;
  double kwota;
 };
//-----------------------------
//-----------------------------
 void zapisz();
 void odczyt(int n);

//-----------------------------
 
 int main(){
 int x,k;
  
 do{
             system("CLS");  // czyszczenie ekranu
             printf(" 1 - Nowa transakcja ");
             printf("\n 2 - Wyszukaj dane ");
             printf("\n 3 - Zakoncz program ");
             printf("\n\n  Wybieram opcje nr : ");
             scanf("%d",&x);
             
              switch(x){
               case 1 : zapisz();
                    break;
               case 2 : {
                    system("CLS");
                    printf("Podaj numer konta dla ktorego chcesz sprawdzic operacje : ");
                    scanf("%d",&k);
                    odczyt(k);}break;
               default : break;
               }
}while(x!=3);

 return 0;
}
//==============================================================================
void zapisz(){
      FILE *plik;
      struct konta rec;
      long lc;  
      
   plik = fopen("konta.txt","a+b");

      system("CLS");
      
      printf(" ---- NOWA TRANSAKCJA ---- ");
      printf("\n\n Numer konta : ");
      scanf("%d",&rec.nr_konta);
      printf(" Data operacja ( dzien miesiac rok ) : ");
      scanf("%d%d%d",&rec._dzien,&rec._miesiac,&rec._rok);
      printf(" Kwota operacji : ");
      scanf("%lf",&rec.kwota);
      
  
      fwrite(&rec,sizeof(rec),1,plik);

      fclose(plik);
      printf("\n\n  Zapisano do pliku...");
      getch();
      }
//==============================================================================
 void odczyt(int n){
      FILE *plik;
      struct konta rec;
      int i=0,z=0;
      
      system("CLS");
      plik = fopen("konta.txt","r+b");//otwarcie pliku do odczytu binarnego
   
      while(1){
        fseek(plik, i*sizeof(rec), 1);
        fread(&rec,sizeof(rec),1,plik);
        if(feof(plik)) break;
     
         if( (rec.nr_konta == n) && (rec._rok == 2005)){

               printf("\n Numer konta   : %d",rec.nr_konta);
               printf("\n Kwota         : %8.3lf zl",rec.kwota);
               printf("\n Data operacji : %d-%d-%d",rec._dzien,rec._miesiac,rec._rok);
               printf("\n");
               z++;
                 } i++;
       }  
      if(z<=0){ printf("Przykro mi, nie ma takiego konta");
                printf("\n Wcisnij ENTER zeby przejsc do menu...");}
 fclose(plik);
 getch();
}
  
0
#include <stdio.h>
#include <cstdlib>
#include <string.h>

#ifdef linux
#define CZYSC(); system("clear");
#else
#define CZYSC(); system("cls");
#endif


using namespace std;

struct OCENA
{
        char data[11];
        float oc;

        OCENA(char* _data, float _oc);
};

OCENA::OCENA(char* _data, float _oc)
{
        strcpy(data,_data);
        oc=_oc;
}

struct STUDENT
{
        char imie[25], nazwisko[25];
        long int numer_indeksu;
        unsigned liczba_ocen;
        OCENA *stopnie[10];

        STUDENT(char* _imie, char* _nazwisko,long int _numer_indeksu);
};

STUDENT::STUDENT(char* _imie, char* _nazwisko,long int _numer_indeksu)
{
        strcpy(imie,_imie);
        strcpy(nazwisko,_nazwisko);
        numer_indeksu=_numer_indeksu;
        liczba_ocen=0;
}

STUDENT *Grupa[30];
STUDENT* dodajStudenta();
int narysujMenu();
int wczytaj(int);
void zapisz(int);
void powrot();
void wyswietlStudenta(int);
void wyswietlGrupe(int);
void wyswietlSredniaStudenta(int);
void wyswietlSredniaGrupy(int);
void dadajOcene(int);

int main()
{
        int choose;
        int iloscStudentow=0;/*2;
        Grupa[0]=new STUDENT("przemek0", "bierut0", 123456);
        Grupa[0]->stopnie[0]=new OCENA("21.21.2121",3);
        Grupa[0]->stopnie[1]=new OCENA("11.03.3241",4);
        Grupa[0]->liczba_ocen=2;

        Grupa[1]=new STUDENT("przemek1", "bierut1", 234567);
        Grupa[1]->stopnie[0]=new OCENA("21.21.2176",3);
        Grupa[1]->stopnie[1]=new OCENA("32.03.3431",4);
        Grupa[1]->stopnie[2]=new OCENA("24.1.2534",3);
        Grupa[1]->stopnie[3]=new OCENA("54.03.8741",4);
        Grupa[1]->liczba_ocen=4;

        Grupa[2]=new STUDENT("przemek2", "bierut2", 345678);
        Grupa[2]->stopnie[0]=new OCENA("21.21.7821",3);
        Grupa[2]->stopnie[1]=new OCENA("32.03.3561",4);
        Grupa[2]->stopnie[2]=new OCENA("12.03.3871",4);
        Grupa[2]->liczba_ocen=3;*/

        while((choose=narysujMenu())!=9)
        {
                CZYSC();
                switch(choose)
                {
                        case 1:
                                Grupa[iloscStudentow]=dodajStudenta();
                                iloscStudentow++;
                        break;
                        case 2:
                                dadajOcene(iloscStudentow);
                        break;
                        case 3:
                                wyswietlStudenta(iloscStudentow);
                        break;
                        case 4:
                                wyswietlGrupe(iloscStudentow);
                        break;
                        case 5:
                                wyswietlSredniaStudenta(iloscStudentow);
                        break;
                        case 6:
                                wyswietlSredniaGrupy(iloscStudentow);
                        break;
                        case 7:
                                zapisz(iloscStudentow);
                        break;
                        case 8:
                                iloscStudentow=wczytaj(iloscStudentow);
                        break;
                        default:
                                printf("Zly wybor\n");
                        break;
                }
                powrot();
        }
        return 0;
}

void dadajOcene(int lS)
{
        long int nI;
        printf("Podaj numer indeksu studenta: ");
        scanf("%ld",&nI);
        int i=-1;
        do
        {       ++i;
                if(Grupa[i]->numer_indeksu==nI)
		{
                        char tempChar[11];
                        float tempFloat;
                        printf("Student: %s %s, %ld\nPodaj date: ", Grupa[i]->imie, Grupa[i]->nazwisko,Grupa[i]->numer_indeksu);
		        scanf("%s", tempChar);
                        printf("Podaj ocene: ");
                        scanf("%f", &tempFloat);
                        Grupa[i]->stopnie[Grupa[i]->liczba_ocen]=new OCENA(tempChar,tempFloat);
                        ++Grupa[i]->liczba_ocen;
		}
		if(i==lS-1&&Grupa[i]->numer_indeksu!=nI)
		{
			printf("Nie znaleziono studenta posiadajacego indeks o numerze: %ld\n",nI);
		}
        }while(i<lS&&Grupa[i]->numer_indeksu!=nI);
}

void wyswietlGrupe(int lS)
{
        for(int i =0;i<lS;++i)
        {
                printf("Student: %s %s, %ld\n", Grupa[i]->imie, Grupa[i]->nazwisko,Grupa[i]->numer_indeksu);
                for(int ii=0;ii<Grupa[i]->liczba_ocen;++ii)
                {
                        printf("\t%s: %4.1f",Grupa[i]->stopnie[ii]->data,Grupa[i]->stopnie[ii]->oc);
                        if(ii%2==0&&ii!=0)printf("\n");
                }
                printf("\n\n");
        }scanf("%d",&lS);
}

void wyswietlStudenta(int lS)
{
        long int nI;
        printf("Podaj numer indeksu studenta: ");
        scanf("%ld",&nI);
        int i=-1;
        do
        {       ++i;
                if(Grupa[i]->numer_indeksu==nI)
		{
                        printf("Student: %s %s, %ld\n", Grupa[i]->imie, Grupa[i]->nazwisko,Grupa[i]->numer_indeksu);
                        for(int ii=0;ii<Grupa[i]->liczba_ocen;ii++)
                        {
                                printf("\t%s: %4.1f",Grupa[i]->stopnie[ii]->data,Grupa[i]->stopnie[ii]->oc);
                                if(ii%2==0&&ii!=0)printf("\n");
                        }
		}
		if(i==lS-1&&Grupa[i]->numer_indeksu!=nI)
		{
			printf("Nie znaleziono studenta posiadajacego indeks o numerze: %ld\n",nI);
		}
        }while(i<lS&&Grupa[i]->numer_indeksu!=nI);
        printf("\n");
}

STUDENT* dodajStudenta()
{
        char imie[25], nazwisko[25];
        long int nI;
	printf("Podaj imie: ");
        scanf("%s", imie);
        printf("Podaj nazwisko: ");
        scanf("%s", nazwisko);
        printf("Podaj numer indeksu: ");
        scanf("%ld", &nI);
        return new STUDENT(imie, nazwisko, nI);
}

void wyswietlSredniaStudenta(int lS)
{
        long int nI;
        printf("Podaj numer indeksu studenta: ");
        scanf("%ld",&nI);
        CZYSC();
        int i=-1;
        do
        {       ++i;
                if(Grupa[i]->numer_indeksu==nI)
		{
                        printf("Student: %s %s, %ld\n", Grupa[i]->imie, Grupa[i]->nazwisko,Grupa[i]->numer_indeksu);
                        float sumaOcen=0;
                        for(int ii=0;ii<Grupa[i]->liczba_ocen;++ii)
                        {
                                sumaOcen+=Grupa[i]->stopnie[ii]->oc;
                        }
                        printf("Srednia: %0.2f",sumaOcen/Grupa[i]->liczba_ocen);
		}
		if(i==lS-1&&Grupa[i]->numer_indeksu!=nI)
		{
			printf("Nie znaleziono studenta posiadajacego indeks o numerze: %ld\n",nI);
		}
        }while(i<lS&&Grupa[i]->numer_indeksu!=nI);
        printf("\n");
}

void wyswietlSredniaGrupy(int lS)
{
        float sumaOcen=0, sumaSrednich=0;
        for(int i=0;i<lS;++i)
        {
                for(int ii=0;ii<Grupa[i]->liczba_ocen;++ii)
                {
                        sumaOcen+=Grupa[i]->stopnie[ii]->oc;
                }
                sumaSrednich+=sumaOcen/Grupa[i]->liczba_ocen;
        }
        printf("Srednia grupy wynosi: %f",sumaSrednich/lS);
}

int narysujMenu()
{
        int choose;
        printf("-----------Menu-----------\n");
        printf("1-Dodaj studenta\n");
        printf("2-Dodaj ocene dla studenta\n");
        printf("3-Wyswietl oceny studenta\n");
        printf("4-Wyswietl oceny grupy\n");
        printf("5-Oblicz srednia studenta\n");
        printf("6-Oblicz srednia grupy\n");
        printf("7-Zapisz dane\n");
        printf("8-Wczytaj dane\n");
        printf("9-Zakoncz program\n");
        printf("--------------------------\n");
        printf("Wybierz opcje: ");
        scanf("%d",&choose);
        return choose;
}

void powrot()
{
        system("pause");
        CZYSC();
}

void zapisz(int lS)
{
        char adresPliku[30];
        printf("Podaj nazwe pliku do zapisu danych: \n");
        scanf("%s", adresPliku);
        FILE *plik=fopen(adresPliku, "w");
        for (int i=0;i<lS;++i)
        {
                fwrite(Grupa[i], sizeof(STUDENT), 1, plik);
                for (int ii=0;ii<Grupa[i]->liczba_ocen;++ii)
                {
                        fwrite(Grupa[i]->stopnie[ii], sizeof(OCENA), 1, plik);
                }
        }
        fclose(plik);
}

int wczytaj(int lS)
{
        for (int i=0;i<lS;++i)
        {
                for (int ii=0;ii<Grupa[i]->liczba_ocen;++ii)
                {
                        free(Grupa[i]->stopnie[ii]);
                }
                free(Grupa[i]);
        }
        lS =-1;
        char adresPliku[30];
        printf("Podaj nazwe pliku do odczytu danych:\n");
        scanf("%s", adresPliku);
        FILE *plik=fopen(adresPliku, "r");
        while (!feof(plik))
        {
		++lS;
		Grupa[lS] = (STUDENT*) malloc(sizeof(STUDENT));
                fread(Grupa[lS], sizeof(STUDENT), 1, plik);
                if (Grupa[lS]->liczba_ocen>0)
		{
                        for (int ii=0;ii<Grupa[lS]->liczba_ocen;++ii)
                        {
                                Grupa[lS]->stopnie[ii] = (OCENA*) malloc(sizeof(OCENA));
                                fread(Grupa[lS]->stopnie[ii], sizeof(OCENA), 1, plik);
                        }
                }
        }
        fclose(plik);
        return lS;
}

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