2016-04-10 12 views
-1

Ich habe ein kindof kompliziertes Dateiformat:Lese kompliziert Formatstring mit fscanf

{ 
     "color": [ 
     45, 
     200, 
     34 
     ], 
     "docnum": 5183, 
     "form": "avoir", 
     "graph": "jdm.N.flat", 
     "id": 0, 
     "lang": "fr", 
     "neighbors": 17, 
     "pos": "N", 
     "pzero": true, 
     "rank": 1, 
     "score": 0.0028284271, 
     "type": 1 
    }, 
    { 
     "color": [ 
     45, 
     200, 
     34 
     ], 
     "docnum": 22809, 
     "form": "argent", 
     "graph": "jdm.N.flat", 
     "id": 1, 
     "lang": "fr", 
     "neighbors": 65, 
     "pos": "N", 
     "pzero": false, 
     "rank": 2, 
     "score": 0.0028284271, 
     "type": 1 
    }, 

Diese Art der Liste geht weiter, für Hunderte von Einträgen. Ich möchte in den variablen Zahlen und eine Zeichenfolge (DOCNUM, Form, id, Nachbarn, Rang, score) so habe ich eine Format-String für diese Art der Eingabe lesen:

 main(){ 

    FILE* in=fopen("fr.N.bien2","r"); 
    int maxwords=100; 
    int maxstringlen=100; 

    char* nodes=malloc(sizeof(char)*maxstringlen*maxwords); 
    if(!nodes){printf("Nodes couldn't be allocated!\n");} 

    int i=0; 

    int* IDs=malloc(sizeof(int)*3*maxwords); 
    int docnum,nei,rank; 
    float score; 
    char* pzero; 
    while(fscanf(in," { \"color\": [ 45, 200, 34 ], \"docnum\": %i,  \"form\": %s \"graph\": \"jdm.N.flat\", \"id\": %i , \"lang\": \"fr\", \"neighbors\": %i , \"pos\": \"N\", \"pzero\": false, \"rank\": %i , \"score\": %f , \"type\" :1 },",&docnum,&nodes[i],&IDs[i],&nei,pzero,&rank,&score)) 
    { 
     printf("node:%s,ID=%i\n",&nodes[i],IDs[i]); 
     i++; 
    } 
    } 

Es sieht kompliziert aus, aber es scheint zu funktionieren, weil ich die erste Instanz richtig verstanden habe. Die Ausgabe lautet:

>>node:"avoir",,ID=0 

jedoch Ausgang an das hält, auch wenn das Format genau in der Datei wiederholt (wie Sie in der Probe sehen). Fehle ich etwas Wichtiges hier? Gibt es eine einfachere Möglichkeit, solche Daten aus einer solchen Datei einzulesen?

+2

Das JSON ist. Besorgen Sie sich Ihre Lieblings-json-Bibliothek und nutzen Sie diese. – Leandros

+0

Das sieht wie ein [JSON] (https://en.wikipedia.org/wiki/JSON) -Objekt aus, und das kann nicht wirklich einfach mit 'scanf' und Familie parsen. Suchen Sie stattdessen nach einer JSON-Bibliothek. –

+0

"Es scheint zu funktionieren, weil ich die erste Instanz richtig verstanden habe" - Berühmte letzte Worte eines Softwareentwicklers, der nicht richtig getestet hat. – Olaf

Antwort

1

Und das komplizierte Format ist JSON

Da die Kommentare vorschlagen, für eine Bibliothek suchen statt (sie können nach dem vorherigen Link gefunden werden) gibt es viele Bibliotheken ist und für wie auch in verschiedenen Sprachen.

In der Tat, Ihre Frage bereits here beantwortet werden könnte