首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言二进制模式文件读取中的错误

C语言二进制模式文件读取中的错误
EN

Stack Overflow用户
提问于 2022-09-06 11:41:27
回答 1查看 59关注 0票数 0

我确实练习了“c引物+”第13.10-4章:编写了一个不接受命令行参数或一个命令行参数的程序。如果有,将其解释为文件名;如果没有参数,则使用标准输入(stdin)作为输入。假设输入是一个浮点数。该程序用于计算和报告输入数字的算术平均值。

结果

标准输入的部分可以很好地工作,但当使用cmd写入和读取文件时,平均值为"nan“。

环境

我使用win10,最新版本的Visual

代码

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
    double ch;
    double numbers[12];
    FILE* fp;
    double average=0;
    int i = 0;
    if (argc==1)
    {
        printf("enter double, end with q\n");
        while (scanf_s("%lf", &ch))
        {
            average += ch;
            printf("%lf\n", ch);
            i++;
        }
    }
    else
    {
        for (int j = 0; j < 12; j++)
            numbers[j] = 10.1 * j;
        fopen_s(&fp, argv[1], "wb");
        fwrite(numbers, sizeof(double), 10, fp);
        fclose(fp);
        if ((fopen_s(&fp, argv[1], "rb")!=0))
        {
            fprintf(stdout,"cant find %s\n", argv[1]);
            exit(EXIT_FAILURE);
        }           
        while (fseek(fp, (long)i * sizeof(double), SEEK_SET)!=0)
        {
            fread(&ch, sizeof(double), 1, fp);
            fprintf(stdout, "ch\n");
            average += ch;
            i++;
        }
        fclose(fp);
    }
    printf("average is %lf\n", average/i);
    return 0;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-06 12:18:07

您对fseek()使用了错误的测试

代码语言:javascript
复制
while (fseek(fp, (long)i * sizeof(double), SEEK_SET)!=0)

手册页

返回值。 如果成功,fseek_fseeki64将返回0。

但是,即使您将!=0更改为==0,它仍然是错误的,因为手册页还说

指针也可以定位在文件末尾之后。

因为文件读取是连续的,所以可以将循环简化为

代码语言:javascript
复制
while (fread(&ch, sizeof(double), 1, fp) == 1)
{
    fprintf(stdout, "ch\n");
    average += ch;
    i++;
}

您还忽略了对文件输入的必要检查:忽略了来自fread()的返回值。

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

https://stackoverflow.com/questions/73621456

复制
相关文章

相似问题

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