Witam,
mam problem z działaniem funkcji fscanf, albo coś ja źle robię. Poniżej jest skrócona wersja programu, zadaniem jego ma być wczytanie wartości z pliku (int i float tylko) za pomocą funkcji fscanf, wypisanie za pomocą printf oraz zapis do pliku za pomocą fprintf (ponowny zapis tego odczytanego pliku). Wczytywane są dwie pierwsze wartości, następnie dwa inty i jeden float, później zaczyna się problem... Poniżej zamieszczam całe info nt programu. Nie chcę gotowego rozwiązania, tylko wskazania co źle robię, z góry dziękuję za odpowiedź.
main.c:
#include <stdio.h>
#include <malloc.h>
typedef struct M_DATA
{
int id;
int bid;
float t,v,x;
} M_DATA;
typedef struct M_TAB
{
int id;
int num;
M_DATA* data;
} M_TAB;
void wczytaj(char* fn,M_TAB* tb)
{
FILE* fp;
int i;
fp = fopen(fn,"r");
fscanf(fp,"ID %i\n",&tb->id);
fscanf(fp,"NUM %i\n",&tb->num);
tb->data = malloc(tb->num*sizeof*tb->data);
for(i = 0;i<tb->num;++i)
{
fscanf(fp,"%i %i %f %f %f\n",&tb->data[i].id,&tb->data[i].bid,&tb->data[i].t,&tb->data[i].v,&tb->data[i].x);
}
fclose(fp);
}
void wypisz(M_TAB tb)
{
int i;
printf("ID %i\n",tb.id);
printf("NUM %i\n",tb.num);
for(i = 0;i<tb.num;++i)
{
printf("%i %i %f %f %f\n",tb.data[i].id,tb.data[i].bid,tb.data[i].t,tb.data[i].v,tb.data[i].x);
}
}
void zapisz(char* fn,M_TAB tb)
{
FILE* fp;
int i;
fp = fopen(fn,"w");
fprintf(fp,"ID %i\n",tb.id);
fprintf(fp,"NUM %i\n",tb.num);
for(i = 0;i<tb.num;++i)
{
fprintf(fp,"%i %i %f %f %f\n",tb.data[i].id,tb.data[i].bid,tb.data[i].t,tb.data[i].v,tb.data[i].x);
}
fclose(fp);
}
int main(int argc,char* argv[])
{
M_TAB tab;
wczytaj("dane.txt",&tab);
wypisz(tab);
zapisz("zapisane.txt",tab);
return 0;
}
dane.txt:
ID 8013
NUM 3
1 1 1.0f -1.0f 0.0f
0 1 0.0f 1.0f -1.0f
2 3 -1.0f 3.0f 2.0f
wynik w terminalu:
[xxx@xxx fscanf]$ ./main
ID 8013
NUM 3
1 1 1.000000 0.000000 0.000000
0 0 0.000000 0.000000 0.000000
0 0 0.000000 0.000000 0.000000
zapisane.txt:
ID 8013
NUM 3
1 1 1.000000 0.000000 0.000000
0 0 0.000000 0.000000 0.000000
0 0 0.000000 0.000000 0.000000
Nie wiem gdzie robię błąd, z góry dziękuję za podpowiedź.
Aha, proszę pamiętać, że jest to skrócona reimplementacja pewnego fragmentu mojego programu, także proszę się nie śmiać z tego 'kodu' ;) Co do błędu, zapewne to jakaś śmieszna mała rzecz, ale nic mi nie przychodzi na myśl (oprócz 'wadliwego' pliku wejściowego).
Pozdrawiam