无法从文本文件读取结构体——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
相关产品推荐
相关产品推荐

