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。这可能是问题的原因?我不确定)。
答案 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
,但这需要%i
或0x
前缀来识别十六进制输入(并将前导零视为指示八进制输入)。
您可能应该更彻底地捕获和测试0X
的结果。如果得到EOF,那就这样吧;但您可能会得到1或2。(在某些情况下,您可能会得到0,但是使用fscanf()
作为第一个转换规范,结果将不会得到0。)
您对%c
的首次呼叫应以fscanf()
打印printf()
而不是1 0
结束,因为10
吃掉了%c
, 1
代表0
。
后续呼叫使%d
捕获换行符%c
,然后捕获号码。
在您阅读\n
之后,下一个18
返回fscanf()
,并且在1
中18
之后有换行符,但是它无法转换{ {1}}转换为十进制数字,因此hexe
保留在E
中,并打印两次。下一个调用将18
放入hex1
并将E
放入hexe
,因此您将在输出中看到10
。
为什么两次获得hex1
的论点相似。 18E 10
后面有一个换行符。同样,12
捕获换行符,然后12
转换将失败(因为%c
遇到了EOF,但转换成功,因此尚未报告EOF)。因此%d
仍包含fscanf()
,因此hex1
将被打印两次。