簡體   English   中英

fstream ::例外意外行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM