[英]fstream::exceptions unexpected behaviour
在下面的代碼中; 知道為什么在執行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()
可能意味着更溫和(甚至正常),例如嘗試轉換失敗,可能是因為您讀取了一些無法轉換為目標類型的數據(例如,流包含“one”和你正試圖讀取int
)或因為(在這種情況下)你已經到達文件的末尾。
底線:iostreams異常很少使用。 一些例外被定義為完全正常的預期情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.