C语言读取txt文件的时候用结构体存储下来乱码问题

课设偶然找到了一个简单的解决方法

方法就是把文件的编码格式改为ANSI

 然后函数这么写,存储下来的就不会乱码(部分代码如下)

struct Order {
	char orderNumber[32];      // 订单号 
    char passengerName[50];    // 旅客姓名
    char contactInfo[20];      // 联系方式
    char IDNum[20];            // 证件号
    char flightNum[10];        // 航班号
    char source[20];           // 出发地
    char destination[20];      // 目的地
    char departureDate[20];    // 起降时间:日期
    char departureTime[20];    // 起降时间:时间
    char seatNumber[5];        // 座位号
    char price[20];			   // 价格 
    char paymentInfo[20];      // 支付信息
    struct Order* next;        // 下一个订单信息的指针
};
Order* parseOrdersFromFile(const char* filename) {
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        printf("无法打开订单!\n");
        return NULL;
    }

    Order* head = NULL;
    Order* current = NULL;
    char line[256];
    
    while (fgets(line, sizeof(line), file)) {
        line[strcspn(line, "\n")] = '\0';
        Order* order = (Order*)malloc(sizeof(Order));
        sscanf(line, "%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,\n]",
               order->orderNumber,order->passengerName, order->contactInfo, order->IDNum, order->flightNum,
               order->source, order->destination, order->departureDate, order->departureTime,
               order->seatNumber, order->price, order->paymentInfo);
        order->next = NULL;

        if (head == NULL) {
            head = order;
            current = order;
        } else {
            current->next = order;
            current = order;
        }
    }

    fclose(file);
    return head;
}

C语言中,将结构体写入文件可能出现乱码的情况,一般是因为结构体中包含了指针或者非字符类型的成员,在写入文件时需要进行额外的处理。以下是一种常用的处理方式: 1. 首先,将结构体成员逐个写入文件,而不是直接将整个结构体写入文件。这样可以避免指针和非字符类型的成员在写入文件时导致的问题。 2. 对于字符串类型的成员,使用`fwrite`函数将字符串以及字符串长度写入文件,而不是直接写入字符串指针。 3. 对于指针类型的成员,需要先将指针指向的内容写入文件,然后在读取时再重新分配内存并将内容读取到指针所指向的位置。这样可以确保指针在写入和读取过程中指向正确的内存位置。 下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char name[20]; int age; } Person; void writePerson(FILE* file, const Person* person) { fwrite(person->name, sizeof(char), strlen(person->name) + 1, file); fwrite(&(person->age), sizeof(int), 1, file); } void readPerson(FILE* file, Person* person) { fread(person->name, sizeof(char), 20, file); fread(&(person->age), sizeof(int), 1, file); } int main() { FILE* file = fopen("person.dat", "wb"); if (file == NULL) { printf("Failed to open file.\n"); return 1; } Person person = {"John Smith", 30}; writePerson(file, &person); fclose(file); file = fopen("person.dat", "rb"); if (file == NULL) { printf("Failed to open file.\n"); return 1; } Person readPerson; readPerson(file, &readPerson); printf("Name: %s\n", readPerson.name); printf("Age: %d\n", readPerson.age); fclose(file); return 0; } ``` 这样处理后,写入文件时不会出现乱码问题读取时同样需要按照相同的方式进行读取,确保数据被正确还原。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值