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);
}