为什么 std::copy (从 istream 到 ostream)会引发 ios::failure 异常?
以下代码应将数据从 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 时抛出异常。
The following code should copy data from an wifstream to wcout.
After the content is copied, the program throws a ios::failure exception.
#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;
}
The stream should only throw an exception (see exception mask) if anything goes bad, but not on EOF.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
为了避免跳过空白,请使用 std::istreambuf_iterator
例外:
本地可能正在使用失败的 codecvt 方面。
尝试注释掉区域设置行,看看会发生什么。
您是否尝试过打印异常情况?
To avoid skipping white space use the std::istreambuf_iterator
The exception:
The local may be using codecvt facet that is failing.
Try commenting out the locale line see what happens.
Have you tried to print what the exceptions is?
由于您使用的是
std::istream_iterator
,因此尝试读取流末尾之后的字符会同时设置eofbit
和failbit
(并且只有在设置了一些错误位之后,迭代器才变得等于结束迭代器)剥离到最基本的部分并恢复为 char 以使其更加简单,程序相当于:
Because you're using
std::istream_iterator
, the attempt to read a character past the end of the stream sets botheofbit
andfailbit
(and only after some error bits are set, does the iterator become equal to the end iterator)Stripping to bare essentials and reverting to char to make it even simpler, program is equivalent to:
根据§27.6.1.2.3/10:
因此,当它到达文件末尾并且无法再提取字符时,它将设置失败位,您已将其设置为产生异常。使用
std::copy
不会改变行为 -istream_iterator
通过operator>>
读取。您可以更轻松地复制文件:
According to §27.6.1.2.3/10:
So, when it reaches the end of the file and can no longer extract a character, it will set the fail bit, which you've set to produce an exception. Using
std::copy
doesn't change the behavior -- anistream_iterator
reads viaoperator>>
.You can copy the file a bit more easily: