C++ 从文件中读取字节并覆盖相同的字节

C++ 从文件中读取字节并覆盖相同的字节,c++,c,file,fread,C++,C,File,Fread,我正在使用fread读取文件的内容,我想重写刚刚读取的字节。那么让我们说: fread(buffer, buffersize, 1, FilePointer); 我想覆盖与我刚才读取的完全相同的字节。缓冲区的大小各不相同,但我希望覆盖刚刚读取的字节数。 我该怎么做呢?这里是你想做什么就做什么的方法。我使用ftell()记住起始位置,这样我就不必担心fread()成功还是失败了 filePos = ftell(FilePointer); fread(buffer, buffersize, 1,

我正在使用
fread
读取文件的内容,我想重写刚刚读取的字节。那么让我们说:

fread(buffer, buffersize, 1, FilePointer);
我想覆盖与我刚才读取的完全相同的字节。缓冲区的大小各不相同,但我希望覆盖刚刚读取的字节数。
我该怎么做呢?

这里是你想做什么就做什么的方法。我使用
ftell()
记住起始位置,这样我就不必担心
fread()
成功还是失败了

filePos = ftell(FilePointer);
fread(buffer, buffersize, 1, FilePointer);
fseek(FilePointer, filePos, SEEK_SET);
fwrite(buffer2, buffersize, 1, FilePointer);
请记住,如果同时读取和写入同一个文件,则需要确保在从读取切换到写入时使用
fflush()
fseek()
。如果你不这样做,你会得到未定义的行为


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

您是否尝试过
fseek
然后
fwrite
?@Yakk,但它不会附加字节而不是覆盖?还有没有比read/fseek/fwrite更快的方法?fread返回读取的对象数。请验证您的文件是以读写访问方式打开的;没有其他属性(可能除了二进制)。@JS1我应该在读取后执行fflush吗?我先做fread,然后是fseek,然后是fwrite,然后是fread,fseek,fwrite。我应该只在fwrite之后执行fflush吗?另外,
ftell()
可能有助于记录文件位置,以便以后使用
SEEK\u SET
fseek()。还要注意,
mmap()
是一个POSIX调用。Windows中有自己的用于内存映射文件的API。Boost库为内存映射文件提供了一个跨平台接口。@Clifford,我应该只在写入后使用fflush吗?同样在写入之后,我的文件指针将与post read相同,对吗?@JimmyC:
fflush()
仅为输出流定义,但在不刷新的情况下执行交错I/O没有问题;该操作将在同一缓冲区上执行,
fflush()
仅强制在您选择的时间将缓冲区提交到文件。如果将此决定权留给操作系统,则可以获得更好的性能,操作系统将确保文件在关闭时保持一致。如果同一个文件由另一个进程操作,您可能希望刷新,但在这种情况下,内存映射文件在任何情况下都是更好的方法。此外,更正确的答案是捕获实际读取的字节数,并将该值用于@JS1建议的fseek和fwrite,而不是假设读取和写入的字节数为bufsize