char hexe;
int hex1;
FILE *pFile;
pFile = fopen("address01", "r");
while (fscanf(pFile,"%c %d",&hexe, &hex1) != EOF) { //ERROR likely here
printf("%c %d", hexe, hex1); //ERROR likely here
}
我的地址01文件:
10
20
22
18
E10
210
12
它正在打印 18 和 12 两次。为什么是这些数字以及如何让它正常工作?
(此外,我希望能够阅读 E10。这可能是问题的原因?我不确定)。
最佳答案
一般来说,如果要读取十六进制,请使用 %x
而不是%d
。但是 - 请注意 %x
将读取 10
作为十进制 16,而不是十进制 10。您可以尝试 %i
,但这需要 0x
或0X
用于识别十六进制输入的前缀(并将前导零视为指示八进制输入)。
您可能应该捕获并测试 fscanf()
的结果更彻底。如果你得到 EOF,那就这样吧;但您可能会得到 1 或 2。(在某些情况下,您可能会得到 0,但使用 %c
作为第一个转换规范,您不会得到 0 的结果)。
您第一次调用fscanf()
应该以printf()
结束打印1 0
而不是10
因为%c
吃1
离开0
对于%d
.
后续调用有 %c
捕获换行符\n
,然后是数字。
阅读完 18
后,下一个fscanf()
返回1
并且在 18
之后有换行符在hexe
,但无法转换 E
转换为十进制数,所以 18
留在 hex1
并且打印了两次。下一个通话地点 E
进入hexe
和10
进入hex1
,所以你看到18E 10
在输出中。
这个论点与为什么你得到 12
类似。两次。 12
后面有一个换行符。再次,%c
捕获换行符,然后捕获 %d
转换会失败(因为 fscanf()
遇到 EOF,但它已经成功转换了一次,所以它还没有报告 EOF)。所以hex1
仍然包含12
,和12
因此将打印两次。
关于c - 如何阻止 fscanf() 重复值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58810923/