【问题标题】:Reading bytes from a file and overwriting the same bytes从文件中读取字节并覆盖相同的字节
【发布时间】:2015-03-10 19:50:53
【问题描述】:

我正在使用fread 读取文件的内容,并且我想覆盖我刚刚读取的字节。所以让我们说:

fread(buffer, buffersize, 1, FilePointer);

我想覆盖我刚刚读取的完全相同的字节。缓冲区的大小各不相同,但我想覆盖我刚刚读取的完全相同的字节数。 我该怎么做?

【问题讨论】:

  • 你试过fseek然后fwrite吗?
  • @Yakk,但它不会追加字节而不是覆盖吗?还有比 read/fseek/fwrite 更快的方法吗?
  • fread 返回读取的对象数。
  • 验证您的文件是否以读写访问权限打开;没有其他属性(可能是二进制除外)。

标签: c++ c file fread


【解决方案1】:

这里是你可以做你想做的事。我使用ftell() 来记住起始位置,这样我就不用担心fread() 是成功还是失败了。

filePos = ftell(FilePointer);
fread(buffer, buffersize, 1, FilePointer);
fseek(FilePointer, filePos, SEEK_SET);
fwrite(buffer2, buffersize, 1, FilePointer);

请记住,如果您同时读取和写入同一个文件,则需要确保在从读取切换到写入时使用fflush()fseek(),反之亦然。如果你不这样做,你会得到未定义的行为。 You can read more about that here.

顺便说一下,如果您正在寻找更快的方法来读取/写入文件中的字节,您可能需要考虑使用 mmap() 将文件映射到内存。

【讨论】:

  • @JS1 我应该在阅读后执行 fflush 吗?我先 fread,然后 fseek,然后 fwrite,然后再 fread、fseek 和 fwrite。我应该只在 fwrite 之后执行 fflush 吗?
  • 另外ftell() 可能有助于记录文件位置,以便稍后fseek() 使用SEEK_SET。另请注意,mmap() 是一个 POSIX 调用。在 Windows 中有自己的用于内存映射文件的 API。 Boost 库为内存映射文件提供了跨平台接口。
  • @Clifford,我应该只在写入后使用 fflush 吗?同样在写入后,我的文件指针将与读取后相同,对吗?
  • @JimmyC : fflush() 仅针对输出流定义,但在不刷新的情况下执行交错 I/O 没有问题;该操作将在同一个缓冲区上执行,fflush() 仅在您选择的时间强制将缓冲区提交到文件。如果您将该决定留给操作系统,您将获得更好的性能,这将确保文件在关闭时保持一致。如果同一个文件被另一个进程操作,您可能想要刷新,但在这种情况下,内存映射文件在任何情况下都是更好的方法。
  • 另外一个更正确的答案是捕获实际读取的字节数,并将该值用于@JS1 提出的 fseek 和 fwrite,而不是假设读取和写入的字节是 bufsize
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多