C语言文件操作问题:writeToFile无法获取用户输入的文件名
解决跨函数传递文件名的问题
你遇到的问题本质是变量作用域导致的——readFromFile里的a是局部变量,作用域仅限于该函数内部,writeToFile无法直接访问它。下面是几种可行的解决方案,按推荐程度排序:
方案1:通过函数参数传递文件名(推荐)
这是最符合C语言设计原则的方案,通过参数将文件名从readFromFile传递到主函数,再传给writeToFile,避免全局变量的耦合问题,同时保证内存安全。
修改readFromFile函数
新增参数用于接收文件名缓冲区,同时用strncat替代strcat防止缓冲区溢出:
// filename:存储文件名的缓冲区;filenameSize:缓冲区的总大小 void readFromFile(Car reg[], int *pNrOfCars, char filename[], int filenameSize){ FILE *fp; printf("filename: "); fscanf(stdin,"%s",filename); // 确保拼接.txt后不会超出缓冲区 strncat(filename,".txt", filenameSize - strlen(filename) - 1); fp=fopen(filename,"r"); if(fp!=NULL){ char model[WORDLENGTH]; int year,milage; while(fscanf(fp,"%s %d %d",model,&year,&milage)==3){ reg[*pNrOfCars]=createCar(model,year,milage); (*pNrOfCars)++; } fclose(fp); } }
修改writeToFile函数
新增filename参数接收要写入的文件名:
void writeToFile(Car reg[], int nrOfCars, const char filename[]){ FILE *fp; fp=fopen(filename,"w"); if(fp!=NULL){ for (int i = 0; i < nrOfCars; i++){ fprintf(fp,"%s %d %d\n", reg[i].model, reg[i].year, reg[i].milage); } fclose(fp); } }
主函数调用示例
#define MAX_CARS 100 // 假设你定义了这个常量 int main(){ Car reg[MAX_CARS]; int nrOfCars = 0; char filename[100]; // 提前分配文件名缓冲区 // 读取文件并获取文件名 readFromFile(reg, &nrOfCars, filename, sizeof(filename)); // 这里添加你的业务逻辑(比如修改车辆数据) // 写入数据到同一个文件 writeToFile(reg, nrOfCars, filename); return 0; }
方案2:使用全局变量(不推荐)
如果只是小型临时程序,可以用全局变量存储文件名,但会增加代码耦合性,大型项目中容易引发意外修改的bug。
修改代码
在两个函数外部定义全局变量:
#include <stdio.h> #include <string.h> #define WORDLENGTH 50 #define MAX_CARS 100 typedef struct { char model[WORDLENGTH]; int year; int milage; } Car; char g_filename[100]; // 全局文件名变量 // 省略createCar函数实现 void readFromFile(Car reg[], int *pNrOfCars){ FILE *fp; printf("filename: "); fscanf(stdin,"%s",g_filename); strcat(g_filename,".txt"); fp=fopen(g_filename,"r"); if(fp!=NULL){ char model[WORDLENGTH]; int year,milage; while(fscanf(fp,"%s %d %d",model,&year,&milage)==3){ reg[*pNrOfCars]=createCar(model,year,milage); (*pNrOfCars)++; } fclose(fp); } } void writeToFile(Car reg[], int nrOfCars){ FILE *fp; fp=fopen(g_filename,"w"); if(fp!=NULL){ for (int i = 0; i < nrOfCars; i++){ fprintf(fp,"%s %d %d\n", reg[i].model, reg[i].year, reg[i].milage); } fclose(fp); } }
方案3:动态分配内存返回文件名指针
通过malloc动态分配内存存储文件名,返回指针给主函数,再传递给writeToFile,注意必须手动释放内存避免泄漏。
修改readFromFile函数
#include <stdlib.h> // 需要包含malloc的头文件 char* readFromFile(Car reg[], int *pNrOfCars){ // 动态分配100字节的内存存储文件名 char *filename = malloc(100 * sizeof(char)); if(filename == NULL){ perror("malloc failed"); return NULL; } FILE *fp; printf("filename: "); fscanf(stdin,"%s",filename); strcat(filename,".txt"); fp=fopen(filename,"r"); if(fp!=NULL){ char model[WORDLENGTH]; int year,milage; while(fscanf(fp,"%s %d %d",model,&year,&milage)==3){ reg[*pNrOfCars]=createCar(model,year,milage); (*pNrOfCars)++; } fclose(fp); } return filename; }
主函数调用示例
int main(){ Car reg[MAX_CARS]; int nrOfCars = 0; char *filename = readFromFile(reg, &nrOfCars); if(filename != NULL){ // 业务逻辑 writeToFile(reg, nrOfCars, filename); free(filename); // 必须释放内存,防止泄漏 } return 0; }
内容的提问来源于stack exchange,提问作者Dlrs
相关产品推荐
相关产品推荐

