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

关于二进制文件写入后重启程序无法读取原有数据的技术咨询

解决二进制文件写入后无法保留/读取的问题

嘿,作为编程初学者碰到这种问题太正常了!我来帮你梳理下最常见的几个原因,结合你给出的代码片段来分析:

1. 文件打开模式用错了(最大概率)

这是新手踩坑最多的点!如果每次打开文件用的是"wb"(二进制只写模式),每次程序运行都会直接清空文件里的原有内容——相当于每次都重新创建一个空文件,之前写的东西当然没了。

正确的打开模式应该根据你的需求选:

  • 要追加新内容同时保留旧内容:用"ab"(二进制追加模式)
  • 要读写现有文件,不存在则创建:可以先判断文件是否存在,存在用"rb+"(二进制读写,不清空),不存在则用"wb+"(创建并读写)

举个反例:如果你的代码里是这么打开文件的,那肯定会丢内容:

FILE *fp = fopen("users.dat", "wb"); // 每次运行清空文件

2. 写入/读取的姿势不对

首先,你的函数名writeing应该是writing啦😉。另外要确保用二进制专用的读写函数:

  • 写入结构体必须用fwrite(),而不是文本模式的fprintf:
    // 写入一个USER结构体到文件
    fwrite(&user_obj, sizeof(USER), 1, fp);
    
  • 读取的时候对应用fread():
    // 从文件读取一个USER结构体
    while (fread(&user_obj, sizeof(USER), 1, fp) == 1) {
        // 处理读取到的用户数据
    }
    

还有个关键细节:写完数据后一定要调用fclose(fp)关闭文件,或者用fflush(fp)强制刷新缓冲区——不然数据可能还留在内存里,没真正写到磁盘上,程序一退出就丢了。

3. 文件路径找错了

如果你只写了文件名(比如"users.bin"),程序会在当前工作目录创建文件。而很多IDE(比如VS、CLion)默认的工作目录不是你的项目根目录,而是Debug或Release文件夹。你可以去这些文件夹里看看有没有生成的文件,或者直接用绝对路径打开文件试试(比如"C:/my_project/users.bin")。

4. 结构体对齐的小坑(概率低但值得注意)

不同编译器的结构体对齐规则可能不一样,如果之前写入的结构体和现在读取的结构体对齐方式不同,会导致读取出来的数据乱码或者读不全。可以在结构体定义前加一行强制对齐的指令:

#pragma pack(1) // 强制按1字节对齐,避免编译器自动填充
typedef struct user {
    char name[30];
    char last_name[30];
    int id_number;
    int phone;
} USER;
#pragma pack() // 恢复默认对齐

给你个完整的示例参考

下面是一个能正确保留数据的简单流程,你可以对照自己的代码改:

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

// 修正函数名拼写
void writing(FILE *fp, USER *user) {
    fwrite(user, sizeof(USER), 1, fp);
}

void reading(FILE *fp, USER *user) {
    printf("已保存的用户信息:\n");
    // 循环读取直到文件末尾
    while (fread(user, sizeof(USER), 1, fp) == 1) {
        printf("姓名:%s %s | ID:%d | 电话:%d\n", 
               user->name, user->last_name, user->id_number, user->phone);
    }
}

int main() {
    FILE *fp = NULL;
    // 先尝试以读写模式打开现有文件
    fp = fopen("users.bin", "rb+");
    if (!fp) {
        // 文件不存在,创建新文件
        fp = fopen("users.bin", "wb+");
        if (!fp) {
            perror("打开文件失败");
            return 1;
        }
    }

    // 先读取已有内容
    USER temp_user;
    reading(fp, &temp_user);

    // 把文件指针移到末尾,准备追加新内容
    fseek(fp, 0, SEEK_END);

    // 输入新用户数据
    USER new_user;
    printf("\n请输入新用户信息:\n");
    printf("名字:");
    scanf("%s", new_user.name);
    printf("姓氏:");
    scanf("%s", new_user.last_name);
    printf("ID:");
    scanf("%d", &new_user.id_number);
    printf("电话:");
    scanf("%d", &new_user.phone);

    // 写入新用户
    writing(fp, &new_user);

    // 一定要关闭文件!
    fclose(fp);

    return 0;
}

你可以先检查自己代码里的文件打开模式和文件关闭步骤,这两个是最容易出问题的地方。如果还有问题,可以把完整的writeing函数和主函数代码贴出来,我再帮你排查~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:42:33