2013-03-08 52 views
5

我想读这个普遍的方式格式化的文件:Ç - 的fscanf带分数和静态文本

Text Description: 12 
Description2: 1 
More descriptive things: 6 

而且我想读的数字12,1,和6到变量。

我曾尝试这样的代码:

fscanf(fptr, "Text Description:%d",&desc1); 
fscanf(fptr, "Description2:%d",&desc2); 
fscanf(fptr, "More descriptive things:%d",&desc3); 

但由于某些原因被填充仅第一个变量。有谁知道这是为什么?

回答

1

添加空间的字符串格式的开头,以避免:

fscanf(fptr, "Text Description:%d",&desc1); 
fgetc(fptr); // drop the next character 
fscanf(fptr, "Description2:%d",&desc2); 

删除所有的流输入整数之后和下一个“\ n”可以用一个循环,而不是做新生产线的问题

fscanf(fptr, " Text Description:%d",&desc1); 
fscanf(fptr, " Description2:%d",&desc2); 
fscanf(fptr, " More descriptive things:%d",&desc3); 
+2

'%d'已经占用了前面所有的空格。唯一不占用空格的'%'是'%c'和'%['。 – Shahbaz 2013-03-08 17:00:04

+0

在这种情况下,他只需要在字符串格式的开头添加空格。感谢您更新的评论答案 – MOHAMED 2013-03-08 17:01:02

0

一旦你处理完了12,你并没有阅读换行符,所以其他两个调用发现代替字符串或整数,因此失败。您可以在下一个fscanf调用中使用空格(这会占用要匹配的字符串前面的所有空白字符)。或者,只要每一行都立即用换行符结束,就可以通过致电fgetc来使用它。

while (fgetc(fptr) != '\n') 
    ; 
+0

我想补充一个'&& FEOF(FPTR)'以防万一while循环(也许检查'ferror'太多,如果你太偏执;) – Shahbaz 2013-03-08 17:18:54

+0

@Shahbaz:是啊,但我假设这个输入文件是给定的。它需要对不可靠的输入文件进行大量的检查。 – teppic 2013-03-08 17:19:55

+0

更好地检查'EOF'。调用'feof'没有发现'EOF'会是错误的。 – md5 2013-03-08 17:23:17