c - 使用 fscanf 读取复杂格式字符串

标签 c formatting scanf

我有一种复杂的文件格式:

{
      "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、form、id、neighbors、rank、score),因此我为此类输入创建了一个格式字符串:

     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

但是,即使格式在文件中完全重复(如示例中所示),输出也会停止。 我在这里错过了一些重要的事情吗? 有没有更简单的方法从这样的文件中读取此类数据?

最佳答案

这个复杂的格式是 JSON

正如评论所建议的,请寻找一个库(可以在前面的链接中找到它们),有很多库并且也适用于不同的语言。

事实上,您的问题可能已经得到解答 here

关于c - 使用 fscanf 读取复杂格式字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36531619/

相关文章:

user-interface - 日期应该格式化在哪一层?

php - 如何格式化从数据库接收到的日期和时间

C 语言,scanf 问题与 char 的

c - floor() 和 ceil() 的可表示结果

ubuntu中rpcgen程序的编译器警告

c - 关于比较文件上的字符串的考试练习

c++ - 取消引用一个等于 nullptr 的指针是标准未定义的行为吗?

c# - 保存后 Excel 格式损坏

c - sscanf 获取被两个固定字符串包围的字符串段

c - 第一个 scanf ("%s") 在使用第二个 scanf ("%s") 时中断,读取 0