无法正常写入文件

时间:2014-05-17 17:24:03

标签: c file-io

我制作了一个以下程序。程序显示没有编译器错误。目录中存在一个文件alive.txt。我想使用gets将字符串写入文件alive.txt,但它无法正常工作。

#include<stdio.h>
#include<conio.h>
#include<ctype.h>
int main()
{
    FILE *myfile;
    char c,d;
    char e[100];
    myfile=fopen("alive.txt","r");

    if(!myfile)
    {
        puts("Disk Error");
        return(1);
    }

    while((c=fgetc(myfile))!=EOF)
    {
        putchar(c);
    }

    puts("\n");
    puts("Do ya want to overwrite this file:{Y/N}");// 
    d=toupper(getchar());

    if(d!='Y')
    {
        puts("Ok.. See ya Later");
        return(1);
    }

    myfile=fopen("alive.txt","w");
    puts("Type The Character to overwrite");
    gets(e);  // scanf works               
    fprintf(myfile,"%s",e);
    fclose(myfile);

    getch();
    return(0);

}

3 个答案:

答案 0 :(得分:2)

当您打开文件进行写入时,该文件已经打开以供阅读。添加

fclose(myfile);

在第二个fopen之前。

答案 1 :(得分:1)

问题是gets()Y之后读取换行并实现'行尾',并返回一个空字符串(因为它删除了换行符),所以没有写入文件的内容。如果您使用scanf("%s", e);代替gets(),则%s格式会跳过前导空格(例如Y后面的换行符)并读取下一个单词。

其他问题包括:

  • 您还在泄漏文件描述符(文件流),因为您没有fclose()来自第一个myFile的{​​{1}}。

  • 您正在使用fopen(),正如评论中所述,这是一个非常糟糕的主意。 (建议使用gets()的教师应强行禁止教学;使用gets()的学生应自动获得0分。)不要使用gets();使用fgets()或 而是getline()。请注意,gets()包含数据中的换行符(如果有空格)。

  • 您正在使用fgets(),然后尝试使用它来检测EOF - 这是不可靠的。

  • 您不会检查char c;来电是否成功;无论如何都要使用文件指针,如果文件因任何原因不存在,将导致程序崩溃。

答案 2 :(得分:0)

#include<stdio.h>
//#include<conio.h> Non-portable
#include<ctype.h>

int main()
{
    FILE *myfile;
    char c,d;
    char e[100];

    myfile=fopen("alive.txt","r");
    if(!myfile)
    {
        puts("Disk Error");
        return(1);
    }

    /* Show the current file content. */
    while((c=fgetc(myfile))!=EOF)
    {
        putchar(c);
    }
    fclose(myFile);   //  Close the read-only file mode. 
    puts("\n");

    puts("Do ya want to overwrite this file:{Y/N}");
    d=toupper(getchar());
    if(d!='Y')
    {
        puts("Ok.. See ya Later");
        return(1);
    }

    /*Flush '\n' character from stdin */
    getchar();

    puts("Type The Characters used to overwrite");
    gets(e);  // scanf works

    myfile=fopen("alive.txt","w"); Re-open in write mode, deleting old file content.
    fprintf(myfile,"%s",e);
    fclose(myfile);

//  getch(); Non-portable

    /* Be nice and close the file when finished with it. */
    fclose(myfile);
    return(0);
}