如何阻止fscanf()复制值?

时间:2019-11-12 01:57:47

标签: 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 

}

我的address01文件:

10
20
22
18
E10
210
12

它两次打印18和12。为什么会有这些数字?如何使它正常运行?

(此外,我希望能够阅读E10。这可能是问题的原因?我不确定)。

1 个答案:

答案 0 :(得分:0)

通常,如果要阅读十六进制,请使用from .items import MyFirstItem, MySecondItem # needed import of Items def process_item(self, item, spider): if isinstance(item, MyFirstItem): return self.handlefirstitem(item, spider) if isinstance(item, MySecondItem): return self.handleseconditem(item, spider) def handlefirstitem(self, item, spider): # needed self added self.storemyfirst_db(item) # function to pipe it to database table return item def handleseconditem(self, item, spider): # needed self added self.storemysecond_db(item) # function to pipe it to database table return item 而不是%x。但是,请注意,%d会将%x读为十进制16,而不是十进制10。您可以尝试10,但这需要%i0x前缀来识别十六进制输入(并将前导零视为指示八进制输入)。

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

您对%c的首次呼叫应以fscanf()打印printf()而不是1 0结束,因为10吃掉了%c1代表0

后续呼叫使%d捕获换行符%c,然后捕获号码。

在您阅读\n之后,下一个18返回fscanf(),并且在118之后有换行符,但是它无法转换{ {1}}转换为十进制数字,因此hexe保留在E中,并打印两次。下一个调用将18放入hex1并将E放入hexe,因此您将在输出中看到10

为什么两次获得hex1的论点相似。 18E 10后面有一个换行符。同样,12捕获换行符,然后12转换将失败(因为%c遇到了EOF,但转换成功,因此尚未报告EOF)。因此%d仍包含fscanf(),因此hex1将被打印两次。