c++ - std::ifstream/FILE* 可以改变大小吗?

标签 c++ c

假设我有以下代码(它只打开一个文件,获取它的大小,然后一次读取所有文件):

std::ifstream file(path, std::ios_base::binary | std::ios_base::ate);
std::istream::streampos file_size = file.tellg();
file.seekg(0);
char* buffer = new char[file_size];
file.read(buffer, file_size);

文件是否有可能在 file.tellg()file.read() 调用之间改变大小(即另一个程序修改文件) ?即如果file.read()成功,是否保证file.gcount() == file_size

并将其扩展到 C*(即执行 fopen("rb")fseek()ftell()rewind(), fread()),如果 fread() 成功,它是否总是返回文件大小(如 ftell 先前报告的那样())?

我倾向于实现定义,但我很好奇 C++ 标准(或 C 标准,因为 C++ 标准为 FILE 相关函数引用它)是否有任何保证在这里或不。

*我在 C++ 中工作,我有两种处理文件的方法:std::fstreamFILE*。 C++ 标准在 FILE* 函数方面遵从 C 标准,这就是我在这里明确提到 C 的原因。

最佳答案

我认为这取决于您打开的文件类型和操作系统的能力。

如果读取操作不符合您的预期,则文件必须在 ftellfread 之间收缩。您可以使用 ftruncate 让另一个进程执行此操作。而且我找不到任何说明打开文件的任何其他进程会发生什么情况的信息。但我不希望他们一定能够读取曾经存在的数据。

关于c++ - std::ifstream/FILE* 可以改变大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435871/

相关文章:

c - 赋值右侧的评估

c++ - C++中的牛顿法

c++ - 解析字符串,其中 "separator"可以作为数据的一部分?

c++ - 为什么在引用计数器上需要存储顺序限制?

内核模块(Linux)中编写的中断可以通知Qt中正在运行的程序吗?没有用户空间程序等待/轮询?

c - 通过引用将 2D VLA 数组传递给函数,返回分配的内存,无指针数组

c - C语言中如何求一个数的长度?

c++ - 如何缩进 cout 输出?

c++ - OpenGL 顶点数组对象使用

c - C编译器中的变量大小是否依赖?