提问人:InBetween 提问时间:12/11/2020 最后编辑:InBetween 更新时间:12/11/2020 访问量:461
防止 std::ifstream 创建空文件
Preventing std::ifstream from creating an empty file
问:
如果找不到具有所提供路径的文件,则以下代码将创建一个空文件:
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?
有没有办法避免这种行为?如果找不到文件,我需要使操作失败,但它总是成功。对于这种行为,我必须回退吗?ifstream
fopen
答:
4赞
Some programmer dude
12/11/2020
#1
这个 std::basic_filebuf::open
引用包含一个方便的表格,说明不同标志会发生什么。正如你所看到的,每次使用时,行为都是创建一个新文件,如果它不存在。app
有一种方法可以解决这个问题:在不使用标志的情况下打开。这样打开就会失败,然后您可以检查。如果它没有失败,则关闭该文件并使用 再次打开。app
app
评论
0赞
InBetween
12/11/2020
谢谢! 之所以存在,是因为否则如果我只传入,我会在读取整个文件后得到一个状态。奇怪的是,失败状态消失了。知道为什么会这样吗?我已经发布了整个代码。app
fail
in | binary
in | out | binary
0赞
EnigmaticBacon
12/11/2020
out 标志使不存在的文件不再是问题,因为它可以为您创建一个。
0赞
InBetween
12/11/2020
@EnigmaticBacon失败的是现有文件。如果我只设置和标记,则文件会正确打开,并且报告的大小正确,但返回 .这不会发生在标志设置或标志设置的情况下。为什么?in
binary
fail()
true
app
out
0赞
Some programmer dude
12/11/2020
@InBetween 当然,当以只读模式打开整个文件后,您会在读取整个文件后获得“失败”。这就是重点。:)
0赞
Asteroids With Wings
12/11/2020
读取不存在的数据自然会失败。这是一个功能。:)
评论