Prosty zapis i odczyt struktury z pliku - podwojony ostatni element

0

Program napisany "dla ćwiczenia", a nie działa sprawnie. Przy odczycie z pliku dwukrotnie wyświetla ostatni element, tak samo do liczenia średniej bierze ostatni element dwukrotnie pod uwagę... Ktoś wie czemu?

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

struct pracownik{
       char imie[20];
       char nazwisko[20];
       int pensja;
};

void zapisz(struct pracownik prac, char* nazwaPliku);

void pobierzDaneIZapisz(char* nazwaPliku);

void odczytaj(char* nazwaPliku);

void srednia(char* nazwaPliku);

int main(int argc, char *argv[])
{
  int m;
  while(m!=0)
  {
       printf("\n Wybierz:\n 1. wprowadz i zapisz dane.\n 2. Odczytaj i wypisz dane.\n 3. Oblicz srednia pensje.\n");
       scanf("%d",&m);
       switch(m)
       {
                case 1:
                     pobierzDaneIZapisz("pracownicy.txt");
                     break;
                case 2:
                     odczytaj("pracownicy.txt");
                     break;
                case 3:
                     srednia("pracownicy.txt");
                     break;
       }
  }
  return 0;
}




void zapisz(struct pracownik prac, char* nazwaPliku){
     FILE*file = fopen(nazwaPliku, "w");
     if(file==NULL){
     printf("Blad odczytu pliku\n");
     return;
     }
     fwrite(&prac, sizeof(prac), 1, file);
     fclose(file);
}

void pobierzDaneIZapisz(char* nazwaPliku){
     struct pracownik prac;
     char tn;
     
     do{
        printf("Podaj imie: ");
        scanf("%s", &prac.imie[20]);
        printf("Podaj nazwisko: ");
        scanf("%s", &prac.nazwisko[20]);
        printf("Podaj pensje: ");
        scanf("%d", &prac.pensja);
        zapisz(prac, nazwaPliku);
        printf("Czy kontynuowac (t/n)");
        scanf("%1s", &tn);
        }while(tn == 't');
}

void odczytaj(char* nazwaPliku){
     struct pracownik prac;
     FILE*file = fopen(nazwaPliku, "r");
     if(file==NULL){
     printf("Blad odczytu pliku\n");
     return;
     }
     else
     {
          do{
             fread(&prac, sizeof(prac), 1, file);
             printf("Imie: %s \n", prac.imie);
             printf("Nazwisko: %s \n", prac.nazwisko);
             printf("Pensja: %d \n", prac.pensja);
          }while(!feof(file));
     }
}

void srednia(char* nazwaPliku){
      float suma = 0.0;
      int i=0;
      struct pracownik prac;
      
      FILE*file = fopen(nazwaPliku, "r");
      if(file==NULL){
      printf("Błąd odczytu pliku");
      }
      while(!feof(file)){
           fread(&prac, sizeof(prac), 1, file);
           suma=suma+prac.pensja;
           i++;             
      }
      printf("Srednia: %f \n", suma/i);
      
      fclose(file);
}
 
0

Zapewne chodzi o to:

fread(&prac, sizeof(prac), 1, file);

ale pokaż jeszcze ten plik, który wczytujesz.

0
          while(true)
            {
             fread(&prac, sizeof(prac), 1, file);
             if(feof(file)) break;
             printf("Imie: %s \n", prac.imie);
             printf("Nazwisko: %s \n", prac.nazwisko);
             printf("Pensja: %d \n", prac.pensja);
           }

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