使用C

时间:2017-09-11 09:14:44

标签: c string file

有人能告诉我为什么文件不会改变吗?它在我使用rewindfseek时有效,但在其他情况下无效。

fputs之后使用fgets的标准方法是什么?文件指示符位于第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);

2 个答案:

答案 0 :(得分:26)

关于C标准中fopen/'+'的定义(例如在this online C standard draft中),从读取切换到写入需要对文件定位功能进行中间调用(重点是我的):

  

7.21.5.3 fopen功能

     

(7)以更新模式打开文件时(' +'作为第二个或第三个   上面的模式参数值列表中的字符),输入和   可以在关联的流上执行输出。但是,输出   在没有干预呼叫的情况下,不得直接输入   fflush功能或文件定位功能(fseek,fsetpos,   或倒带),输入不得直接输出而不输出   除非输入,否则对文件定位功能进行干预调用   操作遇到文件结束。打开(或创建)文本文件   使用更新模式可以改为打开(或创建)某些二进制流   的实施方式。

所以我建议您编写以下代码来克服您的问题:

fseek ( fp , 0, SEEK_CUR);
fputs(str, fp);

答案 1 :(得分:7)

fopen的{​​{3}}说明了这一点:

  

指定"r+""w+""a+"访问类型时,两者都有   读取和写入已启用(该文件据说是开放的   “更新”)。但是,当您从阅读切换到写入时,输入   操作必须遇到EOF标记。如果没有EOF,那么你   必须使用对文件定位功能的干预调用。文件   定位函数是fsetposfseekrewind。当你   从写作切换到阅读,你必须使用干预电话   fflush或文件定位功能。