我正在尝试读取包含整数数组的JSON格式文件(例如[0,1,2,3,4]) 我想知道为什么fscanf跳过文件中的括号并在我使用
时直接转到数字 // the type of value is integer
FILE* fp=fopen(file,"r");
fscanf( fp,"%d",&value);
我仍然是I / O的新手,我不知道为什么会这样。我想每当我调用fscanf时,文件指针就会向前移动1个位置。
答案 0 :(得分:0)
您应该检查返回值。您的示例中的fscanf
应该返回0,因为遇到的第一个非空格字符是[
,它无法启动数字,因此解析失败。假定的返回值为0表示没有发生成功转换。 value
的值可能保持不变(我在手册页中找不到具体的声明)。文件中的读取位置将在[
之前,以便后续尝试从文件中读取int也将失败。
如何阅读json数组:
请注意,我不处理以下示例中的错误。你必须这样做......
scanf
格式字符串可以包含转换规范,其中包含允许或禁止字符的列表。这可用于读取“离开”不是数字的任何内容:char buf[some large enough value]; fscanf(" %[^0-9]", buf);
。阅读位置现在在第一个数字之前。
然后你会做一个循环做两件事:
我们前面的数字可以通过fscanf("%d", &value);
轻松阅读。这也将在稍后的迭代中跳过该数字之前的可能空格。
现在我们必须处理逗号:fscanf(" %[,]", buf);
(“读取逗号,可选地前面有空格”)。现在您可以阅读下一个号码。
最后一个数字后面不会有逗号。因此,读取逗号的尝试将失败(即返回0);这可以用作数组末尾指标。
如果可能有更多数组或其他内容,则必须读掉剩余的空格并关闭方括号,以便将数组后面的文件位置留给其他人。