假设我有以下代码(它只打开一个文件,获取它的大小,然后一次读取所有文件):
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::fstream
和 FILE*
。 C++ 标准在 FILE*
函数方面遵从 C 标准,这就是我在这里明确提到 C 的原因。
最佳答案
我认为这取决于您打开的文件类型和操作系统的能力。
如果读取操作不符合您的预期,则文件必须在 ftell
和 fread
之间收缩。您可以使用 ftruncate
让另一个进程执行此操作。而且我找不到任何说明打开文件的任何其他进程会发生什么情况的信息。但我不希望他们一定能够读取曾经存在的数据。
关于c++ - std::ifstream/FILE* 可以改变大小吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29435871/