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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
  

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

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

如何以编程方式 (Python/JS/C++) 将矢量图形 (SVG) 插入 JPG/TIF 等光栅图像?

【中文标题】如何以编程方式 (Python/JS/C++) 将矢量图形 (SVG) 插入 JPG/TIF 等光栅图像?【英文标题】:How to insert vector graphics (SVG) to a raster image such as JPG/TIF programmatically (Python/JS/C++)? 【发布时间】:2021-02-18 15:10:11 【问题描述】:

我需要一种编程方式将剪切路径(另存为 SVG 文件)嵌入到另一个图像,例如 JPG/TIF/PSD。使用 Photoshop 等工具可以轻松完成此操作,并且路径将插入到图像 8BIM 配置文件中,但似乎无法以编程方式完成。 ImageMagick 允许您使用以下命令获取矢量图像:

identify -format "%[8BIM:1999,2998:#1]" test.jpg > test.svg

但似乎无法进行反向操作并添加矢量图像。任何人都可以建议任何允许此操作的库吗?

【问题讨论】:

插入 JPEG 可能更容易,因为这些片段是独立的,并且与 TIFF 不同,TIFF 的偏移量会因插入新的 8BIM 块而混乱。 请考虑与嵌入式 8BIM 配置文件共享一些示例文件 - 可能通过 Dropbox 或 Google Drive,因为 imgur 会删除/修改它们。 当然,在这里你可以找到一个非常小的正方形的图片,有8BIM路径和没有路径,路径也以svg文件的形式提供:drive.google.com/drive/folders/… 【参考方案1】:

目前的代码比我想写的要多一些,但应该可以使用以下信息将 8BIM 放入 JPEG。

描述了 JPEG 的解剖结构 here 和 here。

您可以使用 PIL 或 OpenCV 将 JPEG 编码到内存缓冲区中,然后使用 this 之类的代码定位和修改/添加段(例如 8BIM)。或者,您可以在要修改的现有 JPEG 中只使用 read()。要插入片段,只需将前几个片段写入磁盘,然后写入新片段,然后写入您在开始时读取的现有文件中的剩余片段。

您可以使用this 答案构建要插入的 8BIM 段。

您可以使用exiftool -v -v -v 查看 8BIM 在 Photoshop 创建的 JPEG 中出现的位置,然后将您的放在类似的位置。显然,您也可以同样使用 exiftool 来查看您自己的尝试在哪里/如何着陆。

【讨论】:

以上是关于C语言如何以插入方式写入文件的主要内容,如果未能解决你的问题,请参考以下文章

c怎样在文件中插入数据

紧急求助!!!JAVA语言下如何将二进制数字写入文件然后读出来

C语言将数据写入文件,读取出现二次读取

c语言中fputc是啥意思

MySQL数据写入后显示NULL

python 插入文本 详见问题补充