带有while循环的fscanf导致每行双读

时间:2013-10-05 22:57:37

标签: c while-loop scanf

我在阅读文本文件时让fscanf正常工作时遇到了一些麻烦。

我的文本文件是(每个字母前面有[空格]):

 L 10,4 
 S 18,4
 L 20,4
 S 28,4
 S 50,4

我想要做的是读取每一行并将值存储到某个内存中。但是现在,我只是想解决我在使用while循环时遇到的这个问题 - 我基本上每行得到两个输出,我无法弄清楚原因。

这是我的代码:

FILE *tFile = fopen(tracefile, "r");
int address, size;
char operation;
char comma;
printf("START \n");
while(fscanf(tFile, "%c %x %c %d", &operation, &address, &comma, &size) > 0){
    printf("O: %c", operation); 
    printf("\n");
    printf("A: %x", address); 
    printf("\n");
    printf("C: %c", comma); 
    printf("\n");
    printf("S: %d", size); 
    printf("\n");

}
printf("END \n");
fclose(tFile);

最后,我的输出是

START
O:
A: 0
C:
S: 4195731
O: L
A: 10
C: ,
S: 4
O:
A: 10
C: ,
S: 4
O: S
A: 18
C: ,
S: 4
O:

A: 18
C: ,
S: 4
O: L
A: 20
C: ,
S: 4
O:

A: 20
C: ,
S: 4
O: S
A: 28
C: ,
S: 4
O:

A: 28
C: ,
S: 4
O: S
A: 50
C: ,
S: 4
O:

A: 50
C: ,
S: 4
END

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您的格式字符串需要精确匹配文件的格式,否则会在%c s中读取错误的字符。

  • 由于每行开头都有空格,格式也需要有空格
  • 由于第一个数字和逗号后面没有空格,因此格式也不能包含该空格。
  • 逗号之后的空格可能会停留,因为%d允许前导空格,但删除该空格也不会有什么坏处。

这应解决问题:

while(fscanf(tFile, " %c %x%c%d", &operation, &address, &comma, &size) > 0) ...

注意:%x需要一个指向 unsigned int 的指针,因此您应该更改address的声明以匹配预期的类型。

Demo on ideone

答案 1 :(得分:0)

您应该输出与文件中写入的格式类似的格式 例如,您有一行写为L 10,4,那么它应该格式化为%c %d,%d 所以请尝试使用fscanf(tFile, " %c %d,%d", &operation, &address, &size),除非您需要逗号,否则您必须使用fscanf(tFile , " %c %d%c%d" , &operation , &address , &comma , &size)空格很重要