2016-04-10 4 views
-1

と複雑な書式文字列を読んで、私はkindofが複雑なファイル形式を持っている: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 
    }, 

リストのこの種のエントリ数百人のために、上で行きます。私は、変数番号に読むのが好き、と文字列(DOCNUM、フォーム、ID、隣人、ランク、スコア)ので、私は、この種の入力のためのフォーマット文字列を作成します:

 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++; 
    } 
    } 

それは複雑に見えますが、私は最初のインスタンスを正しく取得するので、それは動作しているようです。出力は次のとおりです。

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

ただし、出力はフォーマットが正確に(あなたがサンプルで見ることができるように)ファイルに繰り返しているにもかかわらず、その時に停止します。 ここで重要なことがありませんか? このようなファイルからこの種のデータを簡単に読み取る方法はありますか?コメントが示唆したよう

+2

これはJSONです。あなたのお気に入りのjsonライブラリをつかみ、それを使用してください。 – Leandros

+0

これは[JSON](https://en.wikipedia.org/wiki/JSON)オブジェクトのように見えます。実際には 'scanf'やその家族だけで簡単に解析することはできません。代わりにJSONライブラリを検索してください。 –

+0

「正しく動作していないようだ」 - 正しくテストされなかったソフトウェア開発者の有名な最後の言葉。 – Olaf

答えて

1

そして、この複雑なフォーマットがJSON

で、多くのライブラリと同様に、異なる言語のためにあります(彼らは前のリンク次見つけることができます)の代わりにライブラリを探します。

実際には、あなたの質問に既に回答している可能性があります。here

関連する問題