c - 如何阻止 fscanf() 重复值?

标签 c scanf

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 ,但这需要 0x0X用于识别十六进制输入的前缀(并将前导零视为指示八进制输入)。

您可能应该捕获并测试 fscanf() 的结果更彻底。如果你得到 EOF,那就这样吧;但您可能会得到 1 或 2。(在某些情况下,您可能会得到 0,但使用 %c 作为第一个转换规范,您不会得到 0 的结果)。

您第一次调用fscanf()应该以printf()结束打印1 0而不是10因为%c1离开0对于%d .

后续调用有 %c捕获换行符\n ,然后是数字。

阅读完 18 后,下一个fscanf()返回1并且在 18 之后有换行符在hexe ,但无法转换 E转换为十进制数,所以 18留在 hex1并且打印了两次。下一个通话地点 E进入hexe10进入hex1 ,所以你看到18E 10在输出中。

这个论点与为什么你得到 12 类似。两次。 12 后面有一个换行符。再次,%c捕获换行符,然后捕获 %d转换会失败(因为 fscanf() 遇到 EOF,但它已经成功转换了一次,所以它还没有报告 EOF)。所以hex1仍然包含12 ,和12因此将打印两次。

关于c - 如何阻止 fscanf() 重复值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58810923/

相关文章:

c - 默认情况下,读取输入缓冲区中的哪个字符会使 scanf() 停止读取字符串?

c++ - OpenCV图像阵列,4D矩阵

c - 奇异值分解的时间复杂度

c - 我的代码不起作用。我的 while 循环有问题

C : File redirection is not working

c - scanf 的不同行为

c - 区分c中的0和0.0作为while循环的中断条件

c - 为什么 strtok 与 scanf 会这样交互?

c++ - 为什么FLT_MAX和FLT_MIN不是正负无穷大,它们有什么用?

c++ - 函数导致巨大的内存泄漏?