在C语言中使用fputs写入文件

18

有人可以告诉我为什么文件没有改变吗?当我使用rewindfseek时它是有效的,但其他情况下不行。

fgets之后使用fputs的标准方法是什么?文件指针在第9个位置,因此fputs必须在其后写入,但它似乎没做任何事情。

在文件中:

abcd efgh ijkl mnor

在源代码中:

char c;
char str[15];

FILE *fp = fopen("d:\\data.txt","r+");

fgets(str, 10, fp);

// fseek(fp, 9, SEEK_SET);
// rewind(fp);

printf("%d\n", ftell(fp));
// ftel shows that it's in "9".

printf("%s", str);

fputs(str, fp);
// why its not working

fclose(fp);

10
何时、在哪里以及如何检查输出?在 fputsfclose 调用之间吗?也许你应该使用 fflush 函数刷新文件缓冲区? - Some programmer dude
1
假设打开的文件是用于读取和更新的,其中包含两行文本。您读取第一行,然后将其写入同一文件。您认为这将被写入哪里?在写入之前,您是否需要显式设置文件指针以进行读取? - Weather Vane
要从当前位置进行编辑,请使用 fseek(fp, 0L, SEEK_CUR); - krpra
2个回答

26
关于C标准中fopen/'+'的定义(例如this online C standard draft),从读取切换到写入需要调用一个文件定位函数(重点是我的):

7.21.5.3 fopen函数

(7) 当使用更新模式('+'作为上述模式参数值列表中的第二个或第三个字符)打开文件时,可以在关联的流上执行输入和输出。但是,直接进行输出而没有介入调用fflush函数或文件定位函数(fseek、fsetpos或rewind)的输入操作,不得直接跟随输入,除非输入操作遇到文件结束。在某些实现中,使用更新模式(或创建)文本文件可能会改为使用二进制流(或创建)。

因此,我建议您编写以下代码以解决您的问题:
fseek ( fp , 0, SEEK_CUR);
fputs(str, fp);

7

MS文档中对于fopen的说明如下:

当指定"r+""w+""a+""访问类型时,读写都被启用(文件被称为“更新”)。但是,当您从读取切换到写入时,输入操作必须遇到一个EOF标记。如果没有EOF,则必须使用介于调用文件定位函数之间的调用。文件定位函数包括fsetposfseekrewind。当您从写入切换到读取时,必须使用介于fflush或文件定位函数之间的调用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接