C文件流,在开头追加

inkz8wg9  于 2023-01-04  发布在  其他
关注(0)|答案(5)|浏览(237)

有没有一种简单的方法可以使用文件流在文本文件的开头追加一些内容?因为我能想到的唯一方法是将文件加载到缓冲区中,写入要追加的文本,然后写入缓冲区。我想知道没有缓冲区是否可以做到这一点。

w6mmgewl

w6mmgewl1#

不,这不可能。你得重写文件,在开头插入文本。
编辑:你可以避免阅读整个文件到内存中,如果你使用一个临时文件,即:
1.在文件开头写入要插入的值
1.从旧文件读取X字节
1.将这X个字节写入新文件
1.重复2、3,直到阅读完旧文件
1.将新文件复制到旧文件。

mv1qrgav

mv1qrgav2#

没有简单的方法,因为实际的操作并不简单。当文件存储在磁盘上时,文件开始之前没有空的可用字节,所以你不能只是把数据放在那里。对此没有一个理想的通用解决方案--通常,这意味着复制所有剩余的数据来移动它以腾出空间。
因此,C让你决定如何解决这个问题。

euoag5mw

euoag5mw3#

只是想反驳一些更绝对的说法:
无法将数据追加到文件的开头。
不正确的,有,鉴于某些限制。
当文件存储在磁盘上时,在文件开始之前没有空的可用字节,因此不能将数据放在那里。
当文件在抽象层次上以字节流的形式处理时,可能会出现这种情况。然而,文件系统通常将文件存储为一系列块,并且一些文件系统允许在该层次上有更多的自由访问。
Linux 4.1+(XFS)和4.2+(XFS,ext4)允许您使用fallocate在文件中插入洞,给定特定的偏移量/长度约束:
通常,offset和len必须是文件系统逻辑块大小的倍数,该大小根据文件系统类型和配置而变化。
StackExchange网站上的示例可以通过Web搜索“fallocate prepend to file”找到。

wko9yo5t

wko9yo5t4#

无法将数据追加到文件的开头。
提问者还说,他们想到的解决问题的唯一方法是把整个文件读入内存,然后再把它写出来。
1.写入一个已知长度的零占位符。只要不超过占位符的大小,就可以倒带文件处理程序并覆盖此数据。
一个简单的例子是在开头写入一个unsigned int的大小,表示后面的行数,但是直到到达结尾才能填充,并且可以倒带文件处理程序并重写正确的值。

  • 注意:不同平台上的某些版本的'C'要求您在关闭文件处理程序之前最后将文件处理程序放在文件末尾,这样才能正常工作。*

1.将新数据写入新文件,然后使用文件流将旧数据附加到新文件。删除旧文件,然后将新文件重命名为旧文件名。不要使用复制,这是浪费时间。
所有方法都需要权衡磁盘大小与内存和CPU使用率,这完全取决于您的应用程序需求。

cbjzeqam

cbjzeqam5#

严格来说,这不是一个解决方案,但如果你要向一个长文件添加一个短字符串,你可以创建一个与你想添加的长度相同的循环缓冲区,然后把多余的字符滚动出来:

//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;
}

相关问题