首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件读取错误

文件读取错误
EN

Stack Overflow用户
提问于 2013-04-23 14:36:00
回答 3查看 97关注 0票数 0

当我读取一个文件时,其数量由"\n“分隔。它的代码是:

代码语言:javascript
复制
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 100 000 123 456 12000 6000 780000

然后程序打印

代码语言:javascript
复制
1 100
2 123
3 12000
4 780000

问题:

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

回答 3

Stack Overflow用户

发布于 2013-04-23 14:37:51

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

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

代码语言:javascript
复制
/* Returns number of assignments made. */
while(fscanf(fp," %llu",&amt) == 1)
{
}

此外,我宣布amt为无符号长,以存储一个积极的价值。范围从1到9999999。请告诉我用于此目的的值或数据类型。

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

  • 长int LONG_MIN -2147483647 // -(231-1)类型对象的最小值
  • 长int LONG_MAX +2147483647 // 231-1类型对象的最大值
票数 6
EN

Stack Overflow用户

发布于 2013-04-23 14:45:35

问题2,此外,我宣布amt为无符号长长存储一个正值。范围从1到9999999。请告诉我用于此目的的值或数据类型。

如果amt的范围在0到9999999之间,则可以使用unsigned int类型"%u"。在范围内

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

票数 0
EN

Stack Overflow用户

发布于 2013-04-23 14:57:14

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

一个更好的循环结构是将read命令合并到条件测试中,如下所示:

代码语言:javascript
复制
char line[1000];
while(fgets(line,1000,fp)!=NULL) {
    if(sscanf(line,"%llu",&amt)==1) t_amt=t_amt+amt;
}

请注意,使用fget和fscanf比使用fscanf要好。为什么?因为如果amt遇到单独的"-“或".”,它将无法将值赋值给它,但是仍然可以返回一个"1“,表示在发生这种情况时读取成功,大概是因为"-”和“。可能是有效数字中的第一个字符,即使数字不跟随。手册似乎没有提到这一点!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16172146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档