C++ std::basic\u fstream::put()无效
我有以下代码:C++ std::basic\u fstream::put()无效,c++,fstream,C++,Fstream,我有以下代码: #include <iostream> #include <fstream> int main(int argc, char *argv[]) { if (argc != 2) { std::cout << "Usage: basics <file>" << std::endl; return 0; } std::basic_fstream<unsigne
#include <iostream>
#include <fstream>
int main(int argc, char *argv[]) {
if (argc != 2) {
std::cout << "Usage: basics <file>" << std::endl;
return 0;
}
std::basic_fstream<unsigned char> stream;
stream.open(argv[1], std::fstream::out);
stream.put('T');
stream.put('E');
stream.put('S');
stream.put('T');
stream.flush();
stream.close();
return 0;
}
#包括
#包括
int main(int argc,char*argv[]){
如果(argc!=2){
标准::coutQuoting
与格式化输出函数不同,如果输出失败,此函数不设置failbit
即使您检查流状态,也不会显示任何错误。但是,如果您尝试使用格式化输出操作编写内容,将引发std::bad_cast
异常,因为在可能的原因中,没有与该区域设置对应的方面,在该操作完成时会检查该方面
原始操作不关心本地化,因此不会因此而失败,而如果原始写入失败,则会失败
例外情况
如果std::has_facet(loc)=false,则std::bad_cast
实际上,std::ctype
专门用于char
和wchar\u t
非unsigned char
,您必须手动执行。对于en\u GB.utf8
,std::has_facet(std::locale(“en\u GB.utf8”))==false
您可能应该检查写入是否确实成功。有趣的是,从无符号字符
模板参数更改为字符
(因为std::fstream
是typedefed)解决了这个问题。我不知道为什么;我必须深入研究STL内部才能找到答案。标准流只保证有char
和wchar\u t
的专门化。你不需要刷新和关闭,流死后会这样做。@molbdnilo我添加了刷新,因为我认为它值得所以为了防止像“尝试刷新”这样的评论,我把它放在这里:P