文件读取错误

时间:2013-04-23 14:36:00

标签: c

当我正在读取数量以“\ 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

问题:

  1. 正在跳过一些数字。请帮我纠正错误。

3 个答案:

答案 0 :(得分:6)

  

重复最后一个数字。请帮我纠正错误。

在尝试超出文件末尾读取之前,不会设置

feof()。当读取最后一个值时,对fscanf()的下一次调用将导致amt保持不变。立即检查fscanf()的结果:

/* Returns number of assignments made. */
while(fscanf(fp," %llu",&amt) == 1)
{
}
  

此外,我宣布长期以来无条件存储正值。它的范围是1到9999999.请告诉我使用哪种值或数据类型。

要确定整数类型的范围,请参阅定义的宏INT_MAX/INT_MAXLONG_MIN/LONG_MAXLLONG_MIN/LLONG_MAXUINT_MAXULONG_MAXULLONG_MAX在标题limits.h中,long由标准(来自 5.2.4.2.1 C99标准的整数类型的大小)保证足以存储范围所需的值:

  • long int LONG_MIN -2147483647 // - (231-1)
  • 类型对象的最小值
  • long int LONG_MAX +2147483647 // 231-1
  • 类型对象的最大值

答案 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”表示成功读取,大概是因为“ - ”和“。”可能是有效数字中的第一个字符,即使数字不符合。手册似乎没有提到这一点!