结构体存入文件读取如何不乱码

当我们将结构体存入文件时,如果直接以二进制写入的方式,那么在读取数据时有可能会遇到乱码或者其他解析错误。因此,我们一般采用更加安全和稳定的方式进行结构体与文件的交互,即先将结构体以文本形式编码成字符串,再将字符串写入文件中。在读取时,则需按照约定的格式进行解析,将字符串还原为结构体。

假设我们有一个结构体类型 Person,包括姓名、年龄、性别等信息,首先可以将结构体转成字符串(以JSON格式为例):

 

c复制代码

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <jansson.h> #define FILE_PATH "person_info.txt" typedef struct { char name[20]; int age; char gender[6]; } Person; int main() { // 以JSON格式序列化结构体 Person p = {"zhangsan", 25, "male"}; json_t *json_person = json_pack("{s:s, s:i, s:s}", "name", p.name, "age", p.age, "gender", p.gender); char *str_person = json_dumps(json_person, JSON_COMPACT | JSON_ENSURE_ASCII); // 将序列化后的字符串写入文件 FILE *fp = fopen(FILE_PATH, "w"); if (fp == NULL) { printf("Failed to open file %s\n", FILE_PATH); return -1; } fprintf(fp, "%s\n", str_person); fclose(fp); // 读取文件中的字符串,并解析为结构体 char buffer[1024]; fp = fopen(FILE_PATH, "r"); if (fp == NULL) { printf("Failed to open file %s\n", FILE_PATH); return -1; } fgets(buffer, sizeof(buffer), fp); fclose(fp); json_error_t error; json_t *parsed_json = json_loads(buffer, 0, &error); // 解析JSON字符串 if (!json_is_object(parsed_json)) { fprintf(stderr, "error: JSON format is invalid.\n"); json_decref(json_person); json_decref(parsed_json); return 1; } Person new_p; // 解析JSON对象为Person结构体 json_unpack(parsed_json, "{s:s, s:i, s:s}", "name", new_p.name, "age", &new_p.age, "gender", new_p.gender); printf("name: %s, age: %d, gender: %s\n", new_p.name, new_p.age, new_p.gender); // 释放资源 json_decref(json_person); json_decref(parsed_json); free(str_person); return 0; }

在上述例子中,我们先使用 json_dumps 函数将结构体 p 序列化成为一个JSON格式的字符串 str_person,然后将其写入文件中。这里注意到,在调用 fprintf() 写入文件时,我们加入了\n 换行符,以便于后续读取操作时更好地处理多行字符串。

接下来,在读取文件时,我们首先定义一个 buffer 数组用于存放读取到的数据。然后使用 fgets() 函数将该文件的第一行读取到 buffer 中,并关闭文件。

接着,我们使用 json_loads 函数解析读取到的 JSON 字符串,并检查是否解析成功。如果解析成功,则根据文件中存储的信息,使用 json_unpack 函数将JSON对象转换为结构体类型,最后打印出得到的新结构体数据。

需要注意的是,这里的 json_t 类型是由第三方库 jansson 提供的,需要先安装并链接该库才能使用。另外,当我们使用字符串作为数据存储时,也需要考虑大小端字节序、字符集编码等因素,以保证数据在不同机器和操作系统之间可移植性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将结构体存入文本文件,你可以按照以下步骤进行操作: 1. 创建一个结构体,定义你需要的字段和属性。 2. 打开一个文件,用于存储结构体数据。你可以使用C语言中的`fopen`函数来打开文件,或者C++中的`ofstream`类。 3. 将结构体的数据写入文件。对于C语言,你可以使用`fprintf`函数来将结构体数据按照特定的格式写入文件。对于C++,你可以使用`<<`运算符将结构体数据写入文件。 4. 关闭文件。确保在完成写入操作后,使用C语言中的`fclose`函数或C++中的`close`方法关闭文件。 下面是一个简单的示例,展示了如何将结构体存入文本文件C语言): ```c #include <stdio.h> typedef struct { int id; char name[50]; float salary; } Employee; int main() { Employee emp = {1, "John Doe", 5000.0}; FILE *file = fopen("employees.txt", "w"); if (file == NULL) { printf("无法打开文件!\n"); return -1; } fprintf(file, "%d,%s,%.2f", emp.id, emp.name, emp.salary); fclose(file); return 0; } ``` 以上代码将一个名为"employees.txt"的文件创建在当前目录下,并将结构体`emp`的数据按照"id,name,salary"的格式写入文件中。 当然,如果你使用的是C++,你可以使用C++的文件流来进行操作。以下是一个使用C++进行结构体存储的示例: ```cpp #include <iostream> #include <fstream> #include <string> using namespace std; struct Employee { int id; string name; float salary; }; int main() { Employee emp = {1, "John Doe", 5000.0}; ofstream file("employees.txt"); if (!file) { cout << "无法打开文件!" << endl; return -1; } file << emp.id << "," << emp.name << "," << emp.salary; file.close(); return 0; } ``` 这段代码使用了C++中的文件流,将结构体`emp`的数据按照相同的格式写入名为"employees.txt"的文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值