【问题标题】:Store a integer and floating point number from a .dat file in C language用 C 语言存储来自 .dat 文件的整数和浮点数
【发布时间】:2016-10-02 15:35:39
【问题描述】:

感谢您的关注。我有一个 .dat 文件,格式如下:

3 10.9
1 2.1
(empty line)
10 10.05
10 200

对于每一行,我想将第一个数字(整数)存储到变量a中,并将第二个浮点数存储在变量中

int c;
FILE *fp = fopen("supermarket.dat", "r");
while ((c = fgetc(fp)) != EOF) {
    int var1;
    float var2;
    fscanf(fp, "%d%f", &var1, &var2);
    printf("%d\n", var1);
    printf("%f\n", var2);
}

现在我的程序没有错误,但所有数据都是错误的。 CMD 中的输出为:

10
0.900000
1
2.10000
10
10.050000
10
200.0000000
10
200.000000

如您所见,有些数据是错误的,它没有将空行打印为 0 0。 正确的输出应该是:

3 
10.9
1
2.1
0
0
10 
10.05
10
200

【问题讨论】:

  • 你的 while 循环没有意义。
  • 什么是运行时错误?
  • 混合 "%lf" 和 float 也不是幸福生活的秘诀
  • 我的循环确保读取文件直到最后一个数据,不是吗?
  • @kdopen 抱歉。在我将 %lf 更改为 %f 之后。没有错误。但是还是有一些问题。问题已编辑。

标签: c file floating-point scanf


【解决方案1】:

您正在使用 2 个“并发”例程读取您的输入:fgetc(读取一个字符)和fscanf(读取格式化输入)。 fgetc 部分以错误的方式使用字符。

我想您之所以调用它是因为您想检查是否已到达文件末尾,但这不是正确的方法。

改为这样做:

while (1) {
    int var1;
    float var2;
    int nb_toks = fscanf(fp, "%d%f", &var1, &var2);
    if (nb_toks<2) break;
    printf("%d\n", var1);
    printf("%f\n", var2);
}

fscanf返回成功读取的项目数,所以当你到达文件末尾时,它返回1或0,这意味着你可以跳出循环。

【讨论】:

  • @alk:刚刚编辑过。被循环问题蒙蔽了双眼。 kdopen 已经发出信号了。
  • 谢谢。将 $lf 更改为 %f 使程序现在可以运行。但是CMD中的输出不正确。
  • 忘记了另一个%lf!它应该输出什么?
  • 正确的输出编辑有问题。感谢您的耐心。
  • 获取我的 sn-p 和您的文件,您将按预期获得 3 10.900000 1 2.100000 10 10.050000 10 200.000000(只是运行它)。或者您只是在代码中留下了fgetc
猜你喜欢
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-08
  • 2012-07-30
相关资源
最近更新 更多