【发布时间】:2013-02-14 15:44:03
【问题描述】:
我正在玩弄一些打开、读取和修改文本文件的代码。一个快速(简化)的例子是:
#include <stdio.h>
int main()
{
FILE * fp = fopen("test.txt", "r+");
char line[100] = {'\0'};
int count = 0;
int ret_code = 0;
while(!feof(fp)){
fgets(line, 100, fp);
// do some processing on line...
count++;
if(count == 4) {
ret_code = fprintf(fp, "replaced this line\n");
printf("ret code was %d\n", ret_code);
perror("Error was: ");
}
}
fclose(fp);
return 0;
}
现在在 Linux 上,使用 gcc (4.6.2) 编译此代码运行,并修改文件的第 5 行。在使用 Visual C++2010 编译的 Windows7 上运行的相同代码运行并声称已成功(报告返回代码为 19 个字符,perror 表示“无错误”)但未能替换该行。
在 Linux 上,我的文件具有完全权限:
-rw-rw-rw- 1 mike users 191 Feb 14 10:11 test.txt
据我所知,在 Windows 上也是如此:
test.txt(右键)->属性->安全
为用户、系统和管理员的读写检查“允许”。
我在 Windows 上使用 MinGW 的 gcc 得到了相同的结果,所以我知道这不是 Visual C++ 的“功能”。
我是否遗漏了一些明显的东西,或者我没有得到任何错误,但也没有输出只是在 Windows 上使用 r+ 和 fopen() 的一个未记录的“功能”?
编辑:
似乎即使在Microsoft's site,他们也说“r+”应该打开以供阅读和写作。他们还做了这样的说明:
当“r+”、“w+”或“a+”访问类型被指定时,读取和写入都被允许(文件被称为“更新”打开)。但是,当您在读取和写入之间切换时,必须有中间的 fflush、fsetpos、fseek 或 rewind 操作。如果需要,可以为 fsetpos 或 fseek 操作指定当前位置。
所以我尝试了:
...
if(count == 4) {
fflush(fp);
ret_code = fprintf(fp, "replaced this line\n");
fflush(fp);
printf("ret code was %d\n", ret_code);
...
无济于事。
【问题讨论】:
-
你有没有试过在写操作后使用
fflush刷新流? -
我不确定这是否是问题所在,但在从文件读取和写入之间切换时,您可能需要调用
fseek -
@KristerAndersson - 是的,刚刚更新以澄清我在 MSDN 网站上看到说明你应该通过
f<operations>()之一更新流所以我在之前和之后尝试了fflush()ing写,但没有骰子。 -
@Mike:在程序退出之前尝试关闭文件流。
-
@Mike - 这可能与换行有关吗?我认为windows使用
\r\n将linux使用\n
标签: c linux windows file-io fopen