空哥sky 2024-03-07 09:23 采纳率: 50%
浏览 3
已结题

C语言文件读写,以结构体格式读数据然后就报错了

以结构体格式读数据然后就报错了


#include<stdio.h>
#include <string.h>
struct S
{
    char arr[10];
    int age;
    float score;
};
int main()
{
    struct S s = {0};
    FILE* pf;
    errno_t err = fopen_s(&pf, "C:\\C语言\\test_24_3_6\\test.txt", "r");
    fscanf_s(pf,"%s %d %f",s.arr,&(s.age),&(s.score));
    printf("%s %d %f\n", s.arr, s.age, s.score);
    fclose(pf);
    pf = NULL;
    return 0;
}

img

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-07 09:23
    关注

    引自免费微信小程序:皆我百晓生

    在C语言中使用结构体读取文件时,您遇到了问题。根据您提供的代码片段,您尝试以格式化的方式从文件中读取数据到结构体S的成员变量中。然而,fscanf_s函数对于字符数组(字符串)读取需要额外的安全参数,用来指定缓冲区大小以防止溢出。请参阅以下修正后的代码:

    #include<stdio.h>
    #include <string.h>
    
    struct S
    {
        char arr[10];
        int age;
        float score;
    };
    
    int main()
    {
        struct S s = {0};
        FILE* pf;
        errno_t err = fopen_s(&pf, "C:\\C语言\\test_24_3_6\\test.txt", "r");
    
        // 为fscanf_s提供缓冲区大小以安全读取字符串
        if (pf != NULL)
        {
            fscanf_s(pf, "%9s %d %f", s.arr, _countof(s.arr), &(s.age), &(s.score));
            printf("%s %d %f\n", s.arr, s.age, s.score);
            fclose(pf);
        }
        else
        {
            perror("Failed to open file");
        }
    
        return 0;
    }
    

    上述代码中,我已将fscanf_s调用进行了调整,给字符数组s.arr添加了缓冲区大小参数_countof(s.arr)。这样可以确保在读取字符串时不会超出数组容量,从而避免潜在的安全风险。

    另外,我还增加了对打开文件失败情况的处理,如果fopen_s返回非零值,则会输出错误信息。这样有助于调试和了解程序运行过程中可能遇到的问题。请注意,您的文本文件内容应与结构体成员变量匹配,即文件中应该是一个不超过9个字符的字符串、一个整数和一个小数,各部分之间以空格分隔。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 3月15日
  • 已采纳回答 3月7日
  • 创建了问题 3月7日

悬赏问题

  • ¥30 基于信创PC发布的QT应用如何跨用户启动后输入中文
  • ¥20 非root手机,如何精准控制手机流量消耗的大小,如20M
  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆