带有字符串变量的 fopen 失败

Posted

技术标签:

【中文标题】带有字符串变量的 fopen 失败【英文标题】:fopen with string variable fails 【发布时间】:2019-09-09 05:51:34 【问题描述】:

我正在尝试制作一个小程序,用于在文件中保存一些信息,从用户那里获取文件内容和名称的输入。出于某种原因,我无法将 file_name 保存到 FILE *open 中。

这在输入字符串作为文件名时有效; open = fopen("filename.txt","w");但不是当我尝试将字符串作为变量输入时。我找遍了,到处都找不到答案。

我已经包含了 stdio.h 和 string.h

int main ()


    FILE *open;

    char first_name[16],last_name[21];
    char save_name[30],ext[10];
    char file_name[40];
    int a,b;

    printf("This program will take your name and save it in a file.\n");
    printf("Insert your first name:");
    scanf("%s",&first_name);
    printf("Insert your last name:");
    scanf("%s",&last_name);


    do

        printf("Insert file name with extension:");
        scanf("%[^.].%s", &save_name, &ext);
        //Takes filename lenght, minus the dot
        a = (int)strlen(save_name)-1;
        b = (int)strlen(ext);
        sprintf(file_name,"%s.%s",save_name,ext);

    while(a>8 || b>3);

//This is where my problem lies...

    open = fopen(file_name,"w");

    if(open==NULL)
        printf("File %s failed to open, shutting down...",file_name);
    
    else
        fprintf(open, "%s %s",first_name,last_name);
        printf("\n\nSave successful! File was saved as: %s",file_name);
    

    fclose(open);
    return 0;

【问题讨论】:

你的printf最后打印为file_name是什么?它的值是否正确? 首先,你给程序的输入是什么?那么输出是什么?如果您无法打开文件,例如,会发生什么?打印strerror(errno) 报告?您要在正确的目录中打开文件吗?另外请花一些时间阅读how to ask good questions 和this question checklist。 "open" 是一个系统调用,不是任何变量的好名称。 @ulix 仅在 POSIX 系统中。但我同意这是一个坏名字,但基于其他理由(它不是描述性的)。 @uneven_mark - 测试了你的诊断……它看起来似乎是正确的,直到我注意到换行符没有在其他地方打印! 【参考方案1】:

问题是您的file_name 中有一个前导换行符!换行符是由您的scanf() 调用以"%[^.]" 格式添加的(但我不完全确定为什么)。似乎使用%s 进行字符串输入会自动删除它,但%[^.] 将接受除. 之外的所有字符(包括空格)。使用它来修复它(跳过换行符):

scanf("\n%[^.].%s", &save_name, &ext);

欢迎评论这条换行符的来源 - 这对我来说是个新闻!

PS:在计算a 时不需要- 1,因为点永远不会读入save_name

【讨论】:

我猜\n 的来源是它是之前scanf() 调用的“遗留”,不知何故将其留在了输入流中。 嗯,这确实很奇怪...我做了更改,效果很好。非常感谢您的帮助,现在可以使用了!

以上是关于带有字符串变量的 fopen 失败的主要内容,如果未能解决你的问题,请参考以下文章

fopen打开文件失败的问题

fopen打开文件失败原因分析

文件的打开函数第一类--fopen()

将控制台应用程序更改为 Windows 应用程序后 fopen 失败

php fopen与file_get_contents的区别

verilog $*命令