解决方法
应该可以在没有临时文件的情况下 – 您可以逐块读取文件,将每个块写回(original_position header_size).第一个块将在header_size处写回,为标题留出空间.
但是,你真的不想这样做.如果中止,它会破坏文件(想一想:磁盘空间不足,其他I / O错误,掉电等等).
因此,您实际上应该使用临时文件 – 将所有内容写入其中,然后将其重命名为原始文件的名称(假设您在同一文件系统上创建临时文件,否则您需要复制).
>分配与文件大小相同的缓冲区
>打开文件,将其读入缓冲区
> seek(file,header_size)并在此处写入缓冲区
> seek(file,0)写入标题
如果文件很大,您可以分配较小的缓冲区并重复读取/写入,首先读取file_size – buffer_size,然后写入file_size – buffer_size header_size.然后在file_size – 2 * buffer_size处读取下一个块读取,在file_size – 2 * buffer_size header_size处写入,依此类推.