C语言如何从TXT文件读取数据并存储到结构体与普通变量
问题原因分析
- 使用
fread读取明文文本文件逻辑错误。fread是用于读取二进制格式数据的API,你的input.txt是按行存储的明文内容,和结构体在内存中的二进制布局完全不匹配,直接读取会拿到乱码数据。 - 存在类型不匹配与未初始化变量操作问题。结构体中
value的声明是int类型,你尝试将int*类型的地址&value1赋值给它属于类型错误;同时局部变量value1未初始化就参与赋值,行为完全未定义。
正确实现方案
使用fscanf逐行读取明文内容,依次填充结构体的三个字段即可,代码如下:
#include <stdio.h> #include <stdlib.h> struct variable { char type[10]; char name[10]; int value; }; int main(){ struct variable *object2 = malloc(sizeof(struct variable)); if (object2 == NULL) { perror("malloc failed"); return 1; } // 读取明文用r模式即可,不需要二进制读取的rb模式 FILE *file = fopen("input.txt", "r"); if (file == NULL) { perror("open file failed"); free(object2); return 1; } // 逐行读取三个字段,%s会自动跳过换行、空格等空白符 fscanf(file, "%s", object2->type); fscanf(file, "%s", object2->name); fscanf(file, "%d", &object2->value); fclose(file); // 如果需要将值存储到独立变量,直接赋值即可 int value1 = object2->value; printf("独立变量value1的值:%d\n", value1); printf("结构体内容:%s/%s/%d\n", object2->type, object2->name, object2->value); free(object2); return 0; }
代码说明
fscanf按格式读取内容时,%s会自动跳过换行、空格等空白分隔符,刚好匹配你三行存储的txt内容结构。- 如果需要将读取到的数值存储到独立变量,直接从结构体的
value成员取值赋值即可,不需要额外的指针操作。
内容的提问来源于stack exchange,提问作者user16836597
相关产品推荐
相关产品推荐

