C语言如何以插入方式写入文件

比如有一个文件内容是,“XXXXXXXXXYYYYYYYYYY” ,想要程序运行完成后变成“XXXXXXXXXZZZZYYYYYYYYYY”,而不是写入4个Z后覆盖掉四个Y,请问应该以什么方式打开文件,用什么函数来写?

1、可以使用fseek()来指定文件位置。
  函数原型:int fseek(FILE *stream, long offset, int fromwhere);
  函数说明:函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
  返回值:如果执行成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置,函数返回一个非0值。

2、例程:向test.txt的末尾添加“this is a text"的字符串。

   #include <stdio.h>
  #include <string.h>
  int main()
  {
  const char * szwrite = " this is a text";
  FILE *fp = fopen("test.txt", "a+");
  if (fp==0) {
  printf("can't open file\n");
  return 0;
  }
  fseek(fp, 0,SEEK_END);
  fwrite(szwrite, strlen(szwrite) * sizeof(char), 1, fp);
  fclose(fp);
  return 0;
  }

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-11
一、以只读的方式打开原文件fopen,"r"方式;
二、以只写的方式新建一个文件fopen,"wt"方式;
三、将原文件自y字母前的九个字节的字符写入新文件配合用fgetc()和fputc()两种函数;
四、再将四个‘Z’写入新文件,用fputc()或者fputs()均可;
五、继续将原文件未读完的部分写入新文件,同三
六、将原文件删除,再将新文件改名为原文件即可,用rename()函数本回答被提问者采纳
第2个回答  推荐于2018-09-01
这是不可能实现的。因为数据在硬盘上是连续保存的。
你真要插入的话,唯一的办法是将插入点后面的所有数据都备份一下,然后等你输入了待插入数据后(这意味着有若干字节被覆盖了,不过反正已经备份了),将备份的那些重新输入到文件里。
当然,如果你是在文件开头插入数据,就意味着要重新写一遍整个文件,耗时会很长,但这也是不可避免的。
如果不想破坏原文件的话,可以使用一个临时文件,修改完后删除原文件,将临时文件重命名为原文件的名字。本回答被网友采纳
第3个回答  2014-02-04
注意控制好文件指针就可以了追问

用w+方式打开吗?我用w+打开文件,如果内容是”123456",在3后面fprintf输入字符‘7’,文件会变成“123756”,我想要变成"1237456",请问怎么做

相似回答