几天前我在玩istream迭代器和异常处理,我遇到了这种好奇:#include#include#include#includeusingnamespacestd;intmain(intargc,char*argv[]){if(argc"iss(ifs),iss_end;copy(iss,iss_end,ostream_iterator(cout,"\n"));}catch(constios_base::failure&e){cerr为什么在读取输入文件的最后一个字后总是引发failbit异常? 最佳答案 failbit在读取操作未能
我知道这种行为的起源,因为它已经在SO的多个帖子中得到了很好的解释,一些值得注意的例子是:Whyisiostream::eofinsidealoopconditionconsideredwrong?Usegetline()withoutsettingfailbitstd::getlinethrowingwhenithitseofC++istreamEOFdoesnotguaranteefailbit?它也包含在std::getlinestandard中:3)Ifnocharacterswereextractedforwhateverreason(noteventhediscardedd
创建一个文件并用零填充它:ddif=/dev/zeroof=/tmp/zeroescount=1编写这个小程序来提取它在文件中遇到的第一个无符号整数。#include#includeintmain(){std::ifstreamreader("/tmp/zeroes",std::ios_base::binary);uint32_tnumber;reader>>number;assert(!reader.fail());}为什么会触发断言? 最佳答案 因为/dev/zero提供二进制零,而不是字符'0',并且>>>执行(或尝试执行)文
是否可以使用getline()读取有效文件而不设置failbit?我想使用failbit以便在输入文件不可读时生成异常。以下代码总是在最后一行输出basic_ios::clear-即使指定了有效输入也是如此。测试.cc:#include#include#includeusingnamespacestd;intmain(intargc,char*argv[]){ifstreaminf;stringline;inf.exceptions(ifstream::failbit);try{inf.open(argv[1]);while(getline(inf,line))cout输入.txt:t
是否应该使用std::ws操纵器从流中提取失败位?在以下代码中,Clang编译的(在Xcode4.5.1中)程序最终断言失败。显然s>>std::ws在EOF导致失败。然而GCC4.7.2通过了断言。哪个是正确的?#include#include#includeintmain(intargc,constchar*argv[]){{//Readstringwithtrailingws.std::istringstreams("test");std::stringtest;s>>std::ws;assert(!s.fail());//Nowstoskip,butnofailure.s>>t