【问题标题】:How to concatenate a name of file using fopen function?如何使用 fopen 函数连接文件名?
【发布时间】:2015-08-14 09:10:02
【问题描述】:

我想创建一个在提供的名称后添加特定扩展名的文件。

我创建了这段代码:

void create_file(char name[],char user[],char date[]){

    FILE* fichier=NULL;
    fichier=fopen(strcat(name,".txt"),"a+");
    fprintf(fichier,"user: %s connected at : %s \n",user,date);
    fclose(fichier);

}

但它不起作用。

【问题讨论】:

  • 我想将 name 与 ".txt" 连接我没有得到好的解决方案。我尝试创建一个新字符串 char ch1[]=strcat(name,".txt") 我得到了一个错误。
  • @arrowman 你遇到了什么错误?
  • 错误:初始化程序无法确定“ch1”的大小
  • 我不得不说,请使用tour 并阅读How to Ask 以了解我们对这里问题的期望。

标签: c fopen strcat


【解决方案1】:

如我所见,您的代码存在三个问题,

fichier=fopen(strcat(name,".txt"),"a+");
fprintf(fichier,"user: %s connected at : %s \n",user,date);

即,

  1. 您没有检查name 的NULL。如果为 NULL,strcat() 将调用 undefined behaviour
  2. 您没有确保name 包含足够的内存来保存连接的字符串(可能需要更多信息,因为这可以并且可能应该由调用者自己处理)。如果目的地没有足够的内存,你将再次面临 UB。
  3. 您没有检查fopen() 是否成功。如果fopen() 失败,您将向fprintf() 传递一个无效指针,这将再次导致UB。

以上三个中的任何一个都单独足以使您的代码失败。

【讨论】:

  • 1) 他为什么要在该函数内部检查 name 是否为 null ? 2)他为什么要检查他是否有足够的内存用于该 Function 中的 name ?我认为他会在通过那个“名字”之前进行检查。也许我的看法是错误的。
【解决方案2】:

关于您的评论 -

char ch1[]=strcat(name,".txt");

试试这个 -

const char* name1=".txt";
ch1=malloc(strlen(name)+4+1);  // don't forget to free memory
strcpy(ch1,name);
strcat(ch1,name1);  
fichier=fopen(ch1,"a+");  // also check return of fopen()

【讨论】:

  • 错误:从‘char’到‘const char*’的无效转换[-fpermissive]
  • "char ch1[]=strcat(name,".txt");"由于无效的初始化程序,这是不行的|
  • @Michi 是的,他犯了这个错误,我回答了解决方案。
【解决方案3】:

我认为这对你来说应该足够了:

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

void create_file(char *name,char *user,char *date){
    FILE *fichier = fopen(name ,"a+");

    if (fichier == NULL){
        printf("Error opening file!\n");
        exit(1);
    }

    fprintf(fichier,"user: %s connected at : %s \n",user,date);
    fclose(fichier);
}

int main(void){
    char *name = "database.txt";
    char *user = "Michi";
    char *date = "14.08.15";

    create_file(name, user, date);

    return 0;
}

但如果你真的需要 strcat:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void create_file(char *name,char *user,char *date){
    char s[100];
    strcpy(s, name);
    strcat(s, ".txt");

    FILE *fichier = fopen(s ,"a+");

    if (fichier == NULL){
        printf("Error opening file!\n");
        exit(1);
    }

    fprintf(fichier,"user: %s connected at : %s \n",user,date);
    fclose(fichier);
}

int main(void){
    char *name = "database";
    char *user = "Michi";
    char *date = "14.08.15";

    create_file(name, user, date);

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-26
    • 2016-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2018-03-09
    相关资源
    最近更新 更多