[C] Problem z fscanf?

0

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

0

Skoro ma byc wskazowka, to dwie rzeczy:

  • do czego sluzy format %i
  • jak dokladnie dziala & oraz operator this/wyluskania
0

@up:
-http://www.cplusplus.com/reference/clibrary/cstdio/printf/ druga pozycja w pierwszej tabelce.
-to akurat jest dobrze

alexkd napisał(a)

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


Literka f na końcu floata powoduje te błędy. Masz 2 możliwości 
1. Usunąc z pliku te literki
2. Zmodyfikować linijkę z fscanfem, że to przejdzie.
0

Witam,

dziekuję za zainteresowanie wątkiem.

@t0m_k-tmp:

Mianowicie z tego co mi wiadomo %i używa się w (f)scanf przy wskaźniku na zmienną typu int (liczby całkowitej). Mogę użyć zamiast %i, format %d, ale to nic nie zmienia raczej w moim przypadku. Co do operatora wyłuskania jest on wykorzystywany do uzyskania wartości zmiennej ze wskaźnika - wydaje mi się właśnie, że dobrze go używam.

@prawie bystry:
faktycznie, literka 'f' sprawiała ten problem, ale co najciekawsze, program (także mój) który właśnie portuję z Nintendo DS działa dobrze z literką 'f' w float w pliku tekstowym (używałem tam NitroFS), ciekawe heh :) dobrze przeczuwałem, że to coś błahego :) jeszcze raz dziękuję, raczej wsio ok, teraz przerobię dane wejściowe i sprawdzę w końcowym porcie programu i dam znać :)

0

Przepraszam za post pod postem :)

Wszystko śmiga na końcowym porcie jak powinno być :) Mogę dalej się brać za program, dziękuję jeszcze raz! :)

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