1

在读取文本文件时,我无法让 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

谢谢你的帮助。

4

2 回答 2

1

您的格式字符串需要与您的文件格式精确匹配,否则它会将错误的字符读入%cs.

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

这应该可以解决问题:

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

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

ideone 上的演示

于 2013-10-05T23:03:32.310 回答
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)空格很重要

于 2013-10-05T23:08:19.240 回答