我在阅读文本文件时让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
感谢您的帮助。
答案 0 :(得分:1)
您的格式字符串需要精确匹配文件的格式,否则会在%c
s中读取错误的字符。
%d
允许前导空格,但删除该空格也不会有什么坏处。这应解决问题:
while(fscanf(tFile, " %c %x%c%d", &operation, &address, &comma, &size) > 0) ...
注意:%x
需要一个指向 unsigned int 的指针,因此您应该更改address
的声明以匹配预期的类型。
答案 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)
空格很重要