gpt4 book ai didi

c++ - fstream::exceptions 意外行为

转载 作者:行者123 更新时间:2023-11-30 02:09:26 27 4
gpt4 key购买 nike

在下面的代码中;知道为什么执行 std::copy 时 ifs 变坏了吗?

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>

int main(int argc, char* argv[]) {
std::fstream ifs(argv[1], std::fstream::in | std::fstream::binary);
std::fstream ofs(argv[2], std::fstream::out | std::fstream::trunc | std::fstream::binary);

ifs.unsetf(std::ios_base::skipws);

std::istream_iterator<unsigned char> begin(ifs);
std::istream_iterator<unsigned char> end;

std::ostream_iterator<char> begin2(ofs);

ifs.exceptions(std::fstream::badbit | std::fstream::failbit);
ofs.exceptions(std::fstream::badbit | std::fstream::failbit);

if(!ifs)
std::cerr << "ifs bad" << std::endl;
if(!ofs)
std::cerr << "ofs bad" << std::endl;

try {
std::copy(begin, end, begin2);
}
catch(...) {
if(ifs.bad())
std::cerr << "exception: ifs bad" << std::endl;
if(ifs.fail())
std::cerr << "exception: ifs fail" << std::endl;
if(ifs.eof())
std::cerr << "exception: ifs eof" << std::endl;
}

if(!ifs)
std::cerr << "ifs bad" << std::endl;
if(!ofs)
std::cerr << "ofs bad" << std::endl;

//ofs << ifs.rdbuf();
}

这是我得到的输出。

~$ cp fstream.cpp ~/tmp/fstream/
~$ g++ -ggdb -O0 fstream.cpp

~$ ./a.out a.out xxx.ooo
exception: ifs fail
exception: ifs eof
ifs bad

最佳答案

作为停止复制位置的(默认构造的)end 迭代器只会在尝试从文件中读取指定数据失败时与另一个迭代器进行比较。在这种情况下,它转换了文件中的所有数据并到达了 EOF。这意味着一切都已成功,但是流现在处于失败状态,因此除非您重置它,否则您将无法对该流执行任何其他操作。

您还误解了一些事情:!stream 等同于 stream.fail(),但 stream.bad()stream.bad() 表示出现严重故障,例如在您尝试读取硬盘驱动器时出现故障。 stream.fail() 可能意味着更温和(甚至正常)的事情,例如尝试转换失败,可能是因为您读取了一些无法转换为目标类型的数据(例如,流包含“一个”并且您正在尝试读取 int) 或因为(在本例中)您已到达文件末尾。

底线:iostreams 异常很少有用。一些异常被定义为在完全正常的预期情况下抛出。

关于c++ - fstream::exceptions 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5454232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com