以下代码应将数据从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)
如果出现任何问题,流应该只抛出一个异常(参见异常掩码),但不会抛出异常.
为了避免跳过空白,请使用 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)