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 <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语言如何以插入方式写入文件的主要内容,如果未能解决你的问题,请参考以下文章