我正在摆弄一些打开、读取和修改文本文件的代码。一个快速(简化)的例子是:
#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++“功能”。
我是否遗漏了一些明显的东西,或者事实上我没有收到错误,但也没有输出,只是使用的未记录的“功能”r+
with fopen()
在 Windows 上?
EDIT:
似乎甚至在微软的网站他们说“r+”应该打开以供阅读and写作。他们还做了这样的说明:
当指定“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);
...
无济于事。