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

C语言如何修改代码实现所有主人宠物记录写入文本文件不被覆盖

问题根因
  • 文件打开模式错误:调用fopen("Record.txt", "w")时使用的"w"为覆盖写入模式,每次打开文件都会直接清空原有内容。你在createRecord函数内每次录入记录都重新打开一次文件,前几次录入的内容都会被后一次的打开操作清空,最终只会保留最后一次录入的记录。
  • 变量逻辑存在隐患:你定义了全局的record结构体变量,每次调用createRecord修改的都是同一个变量的内容,最终main函数里的owner数组存储的10条数据也都会和最后一次录入的内容一致。
  • 文件操作逻辑冗余:不需要每次录入一条记录就执行一次打开、关闭文件的操作,频繁IO会降低程序运行效率。
修复方案

推荐的优化修改思路如下:

  1. 将文件打开、关闭操作移到main函数中,仅执行一次,把文件指针作为参数传入createRecord用于写入,避免多次打开清空内容。
  2. 去掉全局的record变量,改为在createRecord内定义局部结构体变量,保证每条记录独立。
  3. 新增文件打开失败的判空逻辑,避免异常崩溃。

修改后的完整代码如下:

#include <stdio.h>
typedef char String[30];

struct ownerTag {
   String ownerName, address, contactNum;
   struct petTag {
      String petName, type;
   } pets[5];
};

// 新增参数:文件指针fp,用于写入当前记录
struct ownerTag createRecord(FILE *fp){
    int i;
    // 改为局部变量,每次生成独立的记录
    struct ownerTag record;

    scanf("%s", record.ownerName);
    fprintf(fp, "%s\n", record.ownerName);
    scanf("%s", record.address);
    fprintf(fp, "%s\n", record.address);
    scanf("%s", record.contactNum);
    fprintf(fp, "%s\n", record.contactNum);

    for(i=0; i<5; i++){
        scanf("%s", record.pets[i].petName);
        fprintf(fp, "%s\n", record.pets[i].petName);
        scanf("%s", record.pets[i].type);
        fprintf(fp, "%s\n", record.pets[i].type);
        printf("\n");
    }
    return record; 
}

int main(){
    int i;
    struct ownerTag owner[10];
    // main内仅打开一次文件,w模式首次写入会清空旧内容,符合新录入全量记录的需求
    FILE *fp = fopen("Record.txt", "w");
    if(fp == NULL){
        printf("文件打开失败\n");
        return 1;
    }

    for(i=0; i<10; i++){
        owner[i] = createRecord(fp);
    }
    // 全部写入完成后再关闭文件
    fclose(fp);
    return 0;
}

如果你需要每次运行程序都往旧文件里追加新记录,不需要清空之前的历史记录,只需要把fopen的模式参数从"w"改为"a"即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:48:03