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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:05:29