为什么这里的“w”不会创建新文件?

时间:2012-12-21 08:44:20

标签: c file

程序总是最终退出。我似乎经常遇到这个问题,我想我以前以某种方式修复了它,但我不确定如何。为什么不创建文件?

#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;
}

4 个答案:

答案 0 :(得分:2)

尝试打印您输入的文件的名称:

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这是一个很棒的功能,只是因为返回问题的描述而不是错误代码。

答案 1 :(得分:1)

我打赌问题是“fgets()实际名称后的隐形字符”。我会让你弄清楚这个角色究竟是什么,来自哪里以及如何修复它,因为“努力解决问题”是编程时学习过程的一部分。如果这很容易,每个人都可以做到。

答案 2 :(得分:0)

如果fopen的返回值为NULL,则表示发生了一些错误。我建议你查看errno全局,看看发生了什么错误,以帮助你调试它没有打开文件的原因。

w标志执行以下操作:

  

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

因此,它应该在不存在时创建文件,或者当文件存在时,覆盖其内容。

如果不这样做,你会遇到另一个问题,但是根据你提供的一些信息,很难说出它是什么。

答案 3 :(得分:-2)

使用 gets() 而不是 fgets()...它会起作用

。 . 获取(文件_w); . .