防止 std::ifstream 创建空文件

Preventing std::ifstream from creating an empty file

提问人:InBetween 提问时间:12/11/2020 最后编辑:InBetween 更新时间:12/11/2020 访问量:461

问:

如果找不到具有所提供路径的文件,则以下代码将创建一个空文件:

std::ifstream file;
file.open(path, std::ios::in | std::ios::binary | std::ios::app);
//file.open(path, std::ios::in | std::ios::binary); will set fail() to true

if (!file.is_open())
    throw std::runtime_error("File could not be opened."); //never reached

file.seekg(0, file.end);
size_t size = file.tellg();
file.seekg(0, file.beg);

char* buffer = new char[size];
file.read(buffer, size);
file.close();

if (file.fail()) 
    throw std::runtime_error("Error reading file."); //why with only std::ios::in | std::ios::binary?

有没有办法避免这种行为?如果找不到文件,我需要使操作失败,但它总是成功。对于这种行为,我必须回退吗?ifstreamfopen

C++ C++11 文件-IO fstream IOstream

评论

0赞 EnigmaticBacon 12/11/2020
如果您在读取模式下打开它,那应该可以执行您想要的操作

答:

4赞 Some programmer dude 12/11/2020 #1

这个 std::basic_filebuf::open 引用包含一个方便的表格,说明不同标志会发生什么。正如你所看到的,每次使用时,行为都是创建一个新文件,如果它不存在。app

有一种方法可以解决这个问题:在不使用标志的情况下打开。这样打开就会失败,然后您可以检查。如果它没有失败,则关闭该文件并使用 再次打开。appapp

评论

0赞 InBetween 12/11/2020
谢谢! 之所以存在,是因为否则如果我只传入,我会在读取整个文件后得到一个状态。奇怪的是,失败状态消失了。知道为什么会这样吗?我已经发布了整个代码。appfailin | binaryin | out | binary
0赞 EnigmaticBacon 12/11/2020
out 标志使不存在的文件不再是问题,因为它可以为您创建一个。
0赞 InBetween 12/11/2020
@EnigmaticBacon失败的是现有文件。如果我只设置和标记,则文件会正确打开,并且报告的大小正确,但返回 .这不会发生在标志设置或标志设置的情况下。为什么?inbinaryfail()trueappout
0赞 Some programmer dude 12/11/2020
@InBetween 当然,当以只读模式打开整个文件后,您会在读取整个文件后获得“失败”。这就是重点。:)
0赞 Asteroids With Wings 12/11/2020
读取不存在的数据自然会失败。这是一个功能。:)