【发布时间】:2011-05-05 04:54:52
【问题描述】:
以下代码应将数据从 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;
}
流应该只在出现任何问题时抛出异常(参见异常掩码),而不是在 EOF 上。
【问题讨论】:
-
设置流异常似乎是个好主意,但它通常不会像您期望的那样工作。相反,只需在使用输入之前检查流状态,例如
if (stream >> var) {/*only now use var*/}.