为什么std :: copy(从istream到ostream)会引发ios :: failure异常?

cyt*_*nox 8 c++ stl stream

以下代码应将数据从wifstream复制到wcout.复制内容后,程序将抛出ios :: failure异常.

#include <string>
#include <iostream>
#include <sstream>
#include <fstream>
#include <locale>
#include <iterator>
#include <algorithm>


int main(void)
{
    std::locale::global(std::locale(""));

    std::wifstream is;
    is.exceptions( std::ios::failbit | std::ios::badbit );
    is.open("test.ts", std::ios::binary);

    is >> std::noskipws;

    std::istream_iterator<wchar_t, wchar_t> in(is);
    std::istream_iterator<wchar_t, wchar_t> end;

    std::copy(in, end,
              std::ostream_iterator<wchar_t, wchar_t>(std::wcout));

    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

如果出现任何问题,流应该只抛出一个异常(参见异常掩码),但不会抛出异常.

Mar*_*ork 2

为了避免跳过空白,请使用 std::istreambuf_iterator

std::copy(std::istreambuf_iterator<wchar_t, wchar_t>(is),
          std::istreambuf_iterator<wchar_t, wchar_t>(),
          std::ostream_iterator<wchar_t, wchar_t>(std::wcout));
Run Code Online (Sandbox Code Playgroud)

例外情况:

本地可能正在使用失败的 codecvt 方面。
尝试注释掉区域设置行,看看会发生什么。

您是否尝试过打印异常情况?

try
{
    // do work
}
catch(std::exception const& e)
{
    std::cout << e.what() << "\n";
}
Run Code Online (Sandbox Code Playgroud)