C语言如何修改代码实现所有主人宠物记录写入文本文件不被覆盖
问题根因
- 文件打开模式错误:调用
fopen("Record.txt", "w")时使用的"w"为覆盖写入模式,每次打开文件都会直接清空原有内容。你在createRecord函数内每次录入记录都重新打开一次文件,前几次录入的内容都会被后一次的打开操作清空,最终只会保留最后一次录入的记录。 - 变量逻辑存在隐患:你定义了全局的
record结构体变量,每次调用createRecord修改的都是同一个变量的内容,最终main函数里的owner数组存储的10条数据也都会和最后一次录入的内容一致。 - 文件操作逻辑冗余:不需要每次录入一条记录就执行一次打开、关闭文件的操作,频繁IO会降低程序运行效率。
修复方案
推荐的优化修改思路如下:
- 将文件打开、关闭操作移到
main函数中,仅执行一次,把文件指针作为参数传入createRecord用于写入,避免多次打开清空内容。 - 去掉全局的
record变量,改为在createRecord内定义局部结构体变量,保证每条记录独立。 - 新增文件打开失败的判空逻辑,避免异常崩溃。
修改后的完整代码如下:
#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
相关产品推荐
相关产品推荐

