当我正在读取数量以“\ n”分隔的文件时。它的代码是:
while(fscanf(fp,"%llu",&amt) == 1)
{
fscanf(fp,"%ld",&amt);
printf("\n %d",i);
printf(" %ld",amt);
t_amt=t_amt+amt;
i++;
}
问题是如果数字是
99000 100 1000 123 456 12000 6000 780000
然后打印程序
1 100
2 123
3 12000
4 780000
问题:
答案 0 :(得分:6)
在尝试超出文件末尾读取之前,不会设置重复最后一个数字。请帮我纠正错误。
feof()
。当读取最后一个值时,对fscanf()
的下一次调用将导致amt
保持不变。立即检查fscanf()
的结果:
/* Returns number of assignments made. */
while(fscanf(fp," %llu",&amt) == 1)
{
}
此外,我宣布长期以来无条件存储正值。它的范围是1到9999999.请告诉我使用哪种值或数据类型。
要确定整数类型的范围,请参阅定义的宏INT_MAX/INT_MAX
,LONG_MIN/LONG_MAX
,LLONG_MIN/LLONG_MAX
,UINT_MAX
,ULONG_MAX
和ULLONG_MAX
在标题limits.h中,long
由标准(来自 5.2.4.2.1 C99标准的整数类型的大小)保证足以存储范围所需的值:
答案 1 :(得分:0)
问题2此外,我宣布amt为unsigned long long存储a 正面价值。可以是1到9999999.请告诉我 为此目的使用哪种值或数据类型。
如果amt
的范围在0到9999999之间,那么您可以使用unsigned int
类型"%u"
。它在
你甚至可以使用int
类型"%d"
来自-2147483647到+2147483647
答案 2 :(得分:0)
你在尝试读取另一个值之前检查了!feof(fp),所以对于最后一次迭代,没有更多的数据要读,但你还没有到达文件的末尾 - 还有一个尝试读取发生,失败, amt 的值与上一次迭代相同。
更好的循环结构是将read命令合并到条件测试中,如下所示:
char line[1000];
while(fgets(line,1000,fp)!=NULL) {
if(sscanf(line,"%llu",&amt)==1) t_amt=t_amt+amt;
}
请注意,使用fgets和sscanf比使用fscanf更好。为什么?因为如果遇到单独的“ - ”或“。”,fscanf()将无法为 amt 赋值。 ,但是当发生这种情况时,仍然可以返回“1”表示成功读取,大概是因为“ - ”和“。”可能是有效数字中的第一个字符,即使数字不符合。手册似乎没有提到这一点!