You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从文本文件读取结构体——C语言循环执行异常问题

问题根源

你用了fread()读取文本文件,但fread()是专门用来读取二进制文件的——它会直接按结构体的内存字节布局去读取数据,而你的data.txt是纯文本格式,两者完全不匹配,所以fread()一开始就读取不到有效数据,返回0,循环自然无法执行。

另外还有两个小问题:

  • 结构体里的rating字段定义为int,但你的文本里是小数(比如4.5),类型不匹配,会导致数据读取错误;
  • printf()里打印price用了%d格式符,这是打印整数的,double类型应该用%f。
修正方案

改用fscanf()读取文本文件,它可以按照文本的格式规则解析内容到结构体中。同时修正类型不匹配和格式符的问题:

修改后的代码

#include <stdio.h>
#include <stdlib.h>

struct data {
    char foodName[FILENAME_MAX];
    // 把rating改成double,匹配文本里的小数评分
    double rating;
    double price;
};

FILE* openFile(char antraste[], char rezimas); // 假设该函数正常工作

int main() {
    FILE* dataText = openFile("Input data file: ", 'r');
    if (dataText == NULL) { // 建议加个空指针判断,防止后续崩溃
        perror("Failed to open file");
        return 1;
    }

    struct data food;

    // 用fscanf按文本格式读取,直到文件结束
    while(fscanf(dataText, "%s %lf %lf", food.foodName, &food.rating, &food.price) == 3)
    {
        printf("name = %s rating = %.1f price = %.1f\n", food.foodName, food.rating, food.price);
    }

    fclose(dataText);
    printf("Done\n");
    return 0;
}

说明

  • fscanf()的格式字符串"%s %lf %lf"对应文本里的:字符串(食物名)、双精度浮点数(评分)、双精度浮点数(价格);
  • 判断返回值为3,确保三个字段都成功读取,避免因文件格式错误导致的异常;
  • 把rating改成double,匹配你文本里的小数评分;如果你的评分本来应该是整数,那需要修改文本里的内容(比如把4.5改成4),同时保持rating为int,格式符换成%d。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:15:40