0

当我正在阅读一个金额以“\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. 它正在跳过一些数字。请帮我纠正错误。
4

3 回答 3

6

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

feof()直到尝试读取文件末尾之后才设置。当读取最后一个值时,下一次调用fscanf()失败而amt保持不变。立即检查结果fscanf()

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

此外,我将 amt 声明为 unsigned long long 以存储正值。范围从 1 到 9999999。请告诉我要用于此目的的值或数据类型。

要确定整数类型的范围,请参见头限制.h 中定义的宏INT_MAX/INT_MAXLONG_MIN/LONG_MAXLLONG_MIN/LLONG_MAX,但UINT_MAX标准保证(来自C99 标准的整数类型的第 5.2.4.2.1节)足以存储所需值的范围:ULONG_MAXULLONG_MAXlong

  • long int LONG_MIN 类型的对象的最小值 -2147483647 // -(231-1)
  • long int LONG_MAX 类型对象的最大值 +2147483647 // 231-1
于 2013-04-23T14:37:51.007 回答
0

您在尝试读取另一个值之前检查了 !feof(fp) ,因此对于最后一次迭代,没有更多数据要读取,但您也没有到达文件的末尾 - 再次尝试读取,失败,并且值amt的值与上一次迭代相比没有变化。

更好的循环结构是将读取命令合并到条件测试中,如下:

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

于 2013-04-23T14:57:14.180 回答
0

问题 2 此外,我将 amt 声明为 unsigned long long 以存储正值。范围从 1 到 9999999。请告诉我要用于此目的的值或数据类型。

如果 的范围amt在 0 到 9999999 之间,那么您可以使用unsigned inttype "%u"。它在范围内

您甚至可以使用从 -2147483647 到 +2147483647 的int类型"%d"

于 2013-04-23T14:45:35.113 回答