//also serves as the buffer; the null char gives the extra char for the begining
char insRay[] = "[inserted text]";
printf("inserting:%s size of buffer:%ld\n", insRay,sizeof(insRay));
//indecies to read in and out to the file
int iRead = sizeof(insRay)-1;
int iWrite = 0;
//save the input, so we only read once
int in = '\0';
do{
in = fgetc(fp);
//don't go to next char in the file
ungetc(in,fp);
if(in != EOF){
//preserve og file char
insRay[iRead] = in;
//loop
iRead++;
if(iRead == sizeof(insRay))
iRead = 0;
//insert or replace chars
fputc(insRay[iWrite],fp);
//loop
iWrite++;
if(iWrite == sizeof(insRay))
iWrite = 0;
}
}while(in != EOF);
//add buffer to the end of file, - the char that was null before
for(int i = 0; i < sizeof(insRay)-1;i++){
fputc(insRay[iWrite],fp);
iWrite++;
if(iWrite == sizeof(insRay))
iWrite = 0;
}
5条答案
按热度按时间1u4esq0p1#
不,这不可能。你得重写文件,在开头插入文本。
编辑:你可以避免阅读整个文件到内存中,如果你使用一个临时文件,即:
1.在文件开头写入要插入的值
1.从旧文件读取X字节
1.将这X个字节写入新文件
1.重复2、3,直到阅读完旧文件
1.将新文件复制到旧文件。
ikfrs5lh2#
没有简单的方法,因为实际的操作并不简单。当文件存储在磁盘上时,文件开始之前没有空的可用字节,所以你不能只是把数据放在那里。对此没有一个理想的通用解决方案--通常,这意味着复制所有剩余的数据来移动它以腾出空间。
因此,C让你决定如何解决这个问题。
yzxexxkh3#
只是想反驳一些更绝对的说法:
无法将数据追加到文件的开头。
不正确的,有,鉴于某些限制。
当文件存储在磁盘上时,在文件开始之前没有空的可用字节,因此不能将数据放在那里。
当文件在抽象层次上以字节流的形式处理时,可能会出现这种情况。然而,文件系统通常将文件存储为一系列块,并且一些文件系统允许在该层次上有更多的自由访问。
Linux 4.1+(XFS)和4.2+(XFS,ext4)允许您使用
fallocate
在文件中插入洞,给定特定的偏移量/长度约束:通常,offset和len必须是文件系统逻辑块大小的倍数,该大小根据文件系统类型和配置而变化。
StackExchange网站上的示例可以通过Web搜索“fallocate prepend to file”找到。
dgsult0t4#
无法将数据追加到文件的开头。
提问者还说,他们想到的解决问题的唯一方法是把整个文件读入内存,然后再把它写出来。
1.写入一个已知长度的零占位符。只要不超过占位符的大小,就可以倒带文件处理程序并覆盖此数据。
一个简单的例子是在开头写入一个unsigned int的大小,表示后面的行数,但是直到到达结尾才能填充,并且可以倒带文件处理程序并重写正确的值。
1.将新数据写入新文件,然后使用文件流将旧数据附加到新文件。删除旧文件,然后将新文件重命名为旧文件名。不要使用复制,这是浪费时间。
所有方法都需要权衡磁盘大小与内存和CPU使用率,这完全取决于您的应用程序需求。
ifsvaxew5#
严格来说,这不是一个解决方案,但如果你要向一个长文件添加一个短字符串,你可以创建一个与你想添加的长度相同的循环缓冲区,然后把多余的字符滚动出来: