使用fgetc / getc后无法写入文件(Windows)

时间:2016-05-13 07:38:02

标签: c windows file

我在Windows(VS 2010)上开发了一个使用fgetc的简单程序,我发现在使用此功能后(与getc相同)我无法写入文件我以适当的权限打开它。

这是一个简单的程序,我写的是为了检查到底是怎么回事:

int main(int argc, char * argv[]) 
{
    FILE *f = NULL;
    char ch = 0;
    int bytes = 0;

    f = fopen(argv[1], "r+");
    ch = fgetc(f);
    bytes = fwrite("1234", sizeof(char), 4, f);
    printf("%d", bytes);
    fflush(f);
    fclose(f);

    system("PAUSE");
    return 0;
}

程序打印4并退出而没有任何错误,但文件内容保持不变。 在我研究了一下后,我发现如果我添加这一行(那就是"没有"):

fseek(f, 0, SEEK_CUR);

该程序按预期工作,文件内容已更改。

添加此行后的所有代码:

int main(int argc, char * argv[]) 
{
    FILE *f = NULL;
    char ch = 0;
    int bytes = 0;

    f = fopen(argv[1], "r+");
    ch = fgetc(f);
    fseek(f, 0, SEEK_CUR)
    bytes = fwrite("1234", sizeof(char), 4, f);
    printf("%d", bytes);
    fflush(f);
    fclose(f);

    system("PAUSE");
    return 0;
}

有谁知道为什么会发生这种情况以及如何解决?

非常感谢, 哈南。

2 个答案:

答案 0 :(得分:2)

它不起作用,因为C标准(C11草案n1570 7.21.5.3 in The FOPEN 功能第7段;以及所有以前的版本)说它不必工作。

  

使用更新模式打开文件时(   +   作为第二或第三个角色   以上   清单   模式   参数值),输入和输出都可以在   相关流。但是,如果没有输入,输出不应直接输入   干预呼吁   fflush   功能或文件定位功能(   fseek   ,   fsetpos   ,要么   rewind   ),并且输入不应该直接跟随输出而没有   干预调用文件定位功能,除非输入操作遇到文件结束 [ - ]

请注意,如果该文件最初为空,则fgetc将返回EOF并且"1234"已被写入。

答案 1 :(得分:0)

来自https://msdn.microsoft.com/en-us/library/yeby3zcb.aspx

  

当指定“r +”,“w +”或“a +”访问类型时,启用读取和写入(该文件称为“更新”打开)。但是,当您从读取切换到写入时,输入操作必须遇到EOF标记。如果没有EOF,则必须使用对文件定位功能的干预调用。文件定位功能是fsetpos,fseek和rewind。当您从写入切换到阅读时,您必须使用fflush或文件定位功能进行干预调用

因为你可能没有点过EOF,所以你需要找到寻找位置,这样你对fseek的调用正是你需要的。

来自fgetc的返回代码的注释也很重要,但目前不影响您的代码。