我在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;
}
有谁知道为什么会发生这种情况以及如何解决?
非常感谢, 哈南。
答案 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
的返回代码的注释也很重要,但目前不影响您的代码。