Avatar billede mieritz Nybegynder
13. april 2004 - 14:56 Der er 15 kommentarer og
1 løsning

Læser ikke det hele i filen

Når vi kører programmet læser den kun char kort[17] ind resten bliver garbage?
Hvordan kan vi ellers læse ind hvis det ikke skal gøres på denne måde og filen er komma sepereret.
Vi skal også kunne gøre det på den måde at det er den sidste linje i filen der læses idet der kommer flere linjer ind senere.

FILE *fp[10];
        for (int t=0; t<10;t++)
        {
            char komma;
            char kort[17];
            char navn[10];
            int z_start;
            int z_slut;
            float u_price;
            float u_saldo;


                int i;
                char fnm[21];
                sprintf(fnm,"%s.txt",brugere[t].return_ID());
                fp[t] = fopen(fnm,"r");

            fscanf(fp[t],"%s,%s,%d,%d,%f,%f",
            kort,navn,&z_start,&z_slut,&u_price,&u_saldo);



            brugere[t].set_ID(kort);
            brugere[t].set_user_name(navn);
            brugere[t].set_zone_start(z_start);
            brugere[t].set_zone_slut(z_slut);
            brugere[t].set_price(u_price);
            brugere[t].set_saldo(u_saldo);
}

filen ser ud som følgende

VE00401000039324D,aaaaaaaaaa,0,0,0,100
Avatar billede arne_v Ekspert
13. april 2004 - 15:18 #1
Prøv:

char kort[17];
char navn[10];

->

char kort[18];
char navn[11];

jeg tror ikke der er plads til nul byten til sidst.
Avatar billede arne_v Ekspert
13. april 2004 - 15:19 #2
Evt. også:

float u_price;
float u_saldo;

->

double u_price;
double u_saldo;
Avatar billede arne_v Ekspert
13. april 2004 - 15:20 #3
(det frarådes iøvrigt normalt at bruge float/double til beløb)
Avatar billede mieritz Nybegynder
13. april 2004 - 15:23 #4
den læser stadig kun char kort[] ind resten bliver stadig garbage det er som den stopper efter kort[].
Avatar billede arne_v Ekspert
13. april 2004 - 15:33 #5
Den er gal med at få %s til at terminere.

  fscanf(fp,"%17s,%10s,%d,%d,%f,%f",
            kort,navn,&z_start,&z_slut,&u_price,&u_saldo);

virker hvis bredden er præcis 17 og 10 af de første felter.
Avatar billede mieritz Nybegynder
13. april 2004 - 19:23 #6
hvad kan man ellers gøre for at læse det ind fordi user name er en variabel længde
Avatar billede arne_v Ekspert
13. april 2004 - 19:30 #7
Prøv og erstat %s med %[^,] som Bertel forklarede i et svar på et af dine tidligere
spørgsmål.
Avatar billede arne_v Ekspert
13. april 2004 - 19:35 #8
Jeg havde aldrig set det før.

Men det virker !
Avatar billede arne_v Ekspert
13. april 2004 - 19:35 #9
[^,] betyder alt andet end komma
Avatar billede mieritz Nybegynder
14. april 2004 - 07:08 #10
ok det ser ud til at virke. Hvad kan jeg så gøre for at læse den sidste linje i filen lige nu læser den kun den første
Avatar billede arne_v Ekspert
14. april 2004 - 07:41 #11
Vil du læse alle linierne eller kun den sidste ?
Avatar billede arne_v Ekspert
14. april 2004 - 07:42 #12
Alle linierne:

while(!feof(fp[t]))
{
...
}
Avatar billede arne_v Ekspert
14. april 2004 - 07:43 #13
At læse sidste linier er ikke nemt at gøre på en standard måde.

Følgende hack virker dog på de mest gængse platforme:

char *get_last_line(char *fnm)
{
  FILE *fp;
  struct stat st;
  char tmpbuf[N];
  int ix,len,bufix;
  stat(fnm, &st);
  len=st.st_size<N?st.st_size:N;
  ix=st.st_size-len;
  fp=fopen(fnm,"rb");
  fseek(fp,ix,SEEK_SET);
  fread(tmpbuf,len,1,fp);
  fclose(fp);
  bufix=len-1;
  while((tmpbuf[bufix]!='\n')&&(bufix>0)) bufix--;
  memcpy(retbuf,tmpbuf+bufix,len-bufix);
  retbuf[len-bufix]='\0';
  return retbuf;
}
Avatar billede arne_v Ekspert
14. april 2004 - 07:44 #14
Og et svar
Avatar billede arne_v Ekspert
14. april 2004 - 07:45 #15
Den sidste kan kombineres med parsningen som:

char *line = get_last_line(fnm);
sscanf(line,"%[^,],%[^,],%d,%d,%f,%f",
            kort,navn,&z_start,&z_slut,&u_price,&u_saldo);
Avatar billede mieritz Nybegynder
15. april 2004 - 20:39 #16
tak for hjælpen. Det med at læse sidste linje kunne jeg ikke få til at virke, men det fungerer fint med at læse alle linjer.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester