Avatar billede hite Nybegynder
10. oktober 2007 - 14:53 Der er 4 kommentarer og
1 løsning

Parse float fra datafil

Hej Eksperter.

Jeg sidder og er ved at indlæse en datafil i C (jeg bruger gcc i ubuntu) hvori der indgår nogle flydende tal. Følgende kode opsummerer mit problem:

#include <stdio.h>
int main(){

  char id[6];
  char chain[6];
  char res_id[6];
  int num;
  double phi, psi;
  int sec_struct;

  char* s1 = "10MH;A;ILE;2;-109.1;153.7;0\n";

  int status = sscanf(s1, "%4s;%1s;%3s;%d;%f;%f;%d",
        id, chain, res_id, &num, &phi, &psi, &sec_struct);

  printf("status %d, id=%6s, phi=%f, psi=%f\n\n",status,id, phi, psi);

  return 0;
}

Jeg så meget gerne at dette program printede både korrekt id og phi og psi, men output på min maskine ser således ud:
status 7, id=  10MH, phi=-3604656804995407320820947686758804829897392765905329388663905596376285437835343140099062532811332735906495708073095399607499980070003944412712407165049166772782987561985977893333324569088541598358064329085223721660499615971315541348923672820750893570619156201472.00, psi=0.00


Er der nogen der har en forklaring på det, og hvordan jeg løser det?
Avatar billede segmose Nybegynder
10. oktober 2007 - 15:05 #1
nt status = sscanf(s1, "%4s;%1s;%3s;%d;%f;%f;%d",
        id, chain, res_id, &num, &phi, &psi, &sec_struct);
skal nok være:
nt status = sscanf(s1, "%4s;%1s;%3s;%d;%lf;%lf;%d",
        id, chain, res_id, &num, &phi, &psi, &sec_struct);
bemærk det inkonsistente i at man skal bruge %lf for double når man læser ind i double og %f når man skriver.
Avatar billede hite Nybegynder
10. oktober 2007 - 15:26 #2
Det var dog et smukt svar. Hvorfor har de ikke %lf beskrevet i Kernighan og Ritchie eller http://cppreference.com/stdio/scanf.html .. ? Weird.
Avatar billede segmose Nybegynder
11. oktober 2007 - 08:52 #3
Har de ikke det på 5. linie?
%lf      a double

og i K&R B1.3 står i teksten (hvorfor ikke i tabellen???) at l foran f betyder double.
Avatar billede hite Nybegynder
11. oktober 2007 - 10:41 #4
Jo cppreference har det nu .. fordi jeg skrev en mail til dem igår efter dit svar, og tilsyneladende er Nate Kohl hurtig til at opdatere =D

K&R har jeg tilsyneladende bare ikke læst godt nok .. det og så at jeg ikke var opmærksom på at double/float var problemet.
Avatar billede segmose Nybegynder
11. oktober 2007 - 12:35 #5
Det var hurtigt han fik ordnet det :)
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