为什么fopen中的"w"选项不会创建新文件?

4
该程序总是最终退出。我似乎经常遇到这个问题,而且我认为我之前不知道如何修复它,为什么它不会创建一个文件?
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main (void){
    FILE *fp;
    int c;

    char file_w[100];
    char string[100];
    printf("Enter filename\n");
    fgets(file_w, 100, stdin);
    fp = fopen(file_w, "w");
    if (fp == NULL){
        printf("Can't open file\n");
        exit(0);
    }   
    printf("Enter a string");
    fgets(string, 100, stdin);
    for(c = 0; c <= sizeof(string); c++)
    {
        fprintf(fp, "%s\n", string);
    }

    printf("file written");
    fclose(fp);
    return 0;
}

如果您找到了问题所在,请更新您的帖子或添加答案。顺便问一下,你的考试怎么样? :) - freedev
5个回答

3
尝试打印您输入的文件名:
printf("%s\n", file_w);

在获取file_w的那一行下面,确保输入你想要的内容。有时终端可能会配置错误。

如果你的电脑是Linux或Unix系统,请尝试输入绝对路径:

/tmp/newfile.txt

如果您的计算机是Windows... 那么请尝试查看 C:\temp\ 是否存在(或创建它),然后输入以下内容:
C:\temp\newfile.txt

无论如何,记住您可以指定绝对路径,而不仅仅是文件名。因此,请仔细检查您是否具有写入应该写入文件的目录的权限。

如果您想检查错误并获得更好的问题描述,请尝试在fopen下面使用以下行而不是您的代码。

  if( fp == NULL ) {
        // Error, as expected.
        perror( "Error opening file" );
        printf( "Error code opening file: %d\n", errno );
        printf( "Error opening file: %s\n", strerror( errno ) );
        exit(-1);
  }

strerror是一个很棒的函数,因为它返回的是问题的描述而不是错误代码。


我在打开文件时遇到了错误:“无效参数”!需要尽快找出问题所在。考试还有一个小时!printf确认名称正确。 - the5thace
我必须在20分钟内进入办公室。然后尝试先打印文件名。确保您只输入纯文本,没有像? * +这样的奇怪字符。 - freedev
是的,名称没有奇怪的字符,很好! - the5thace
你确定了吗?你尝试添加我建议的strerror函数了吗? - freedev
我得到了“strreror returned: invalid argument”的返回。 - the5thace
显示剩余2条评论

1
我猜问题出在“fgets()实际名称后的不可见字符”。我会让你自己找出这个字符是什么,它来自哪里以及如何修复它,因为“苦苦挣扎解决问题”是编程学习过程中的一部分。如果太容易了,每个人都能做到。

考试前还有20分钟,如果你能解决这个问题,我会感激不尽的 :P - the5thace
1
别担心,你会做到的。尝试打印(使用%d)文件名中的每个字符...(使用短名称尝试!) - Mats Petersson
嗯,我可以很好地创建文件名以换行符结尾的文件。这在Windows上被禁止了吗?或者可能存在什么问题? - Daniel Fischer
1
是的,Windows 不喜欢除了 0x20(可能也包括 nbsp、0xA0,但我从未尝试过,因为我在 Linux 机器上)以外的任何空格。我以前见过这种情况。 - Mats Petersson

0
如果fopen的返回值为NULL,则表示发生了某些错误。我建议您查看errno全局变量,以查看发生了什么错误,帮助您调试为什么没有打开文件。 w标志执行以下操作:

写:创建一个空文件以进行输出操作。如果已经存在同名文件,则其内容将被丢弃,并将该文件视为新的空文件。

因此,当不存在文件或者文件已经存在时,它都应该创建一个文件并覆盖其内容。
如果它没有这样做,那么您就有另一个问题,但从您提供的少量信息中很难确定是什么问题。

我还能提供什么其他信息? - the5thace
应该有管理员账户。之前手头已经有类似的程序在运行! - the5thace
你用调试器调试过了吗?看看发生了什么?还要像我建议的那样检查errno的内容。 - Tony The Lion

0

我尝试使用以下文件名:

C:\\temp\\test_file.txt

或者

fopen("C:\\temp\\employees.txt", "w");

这样做是没有问题的,没有错误(我在Windows 10上制作的。GCC win32,版本:6.3.0)。

我认为你必须使用绝对路径来创建文件。


-2

使用gets()代替fgets()...它会起作用

. . gets(file_w); . .


2
gets()是一种不安全的函数,自C11以来已从C标准中删除。您不应该鼓励人们使用它,而应改用fgets()(或如果可能的话getline()),并手动处理任何尾随换行符。 - G. Sliepen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接