我如何将std::ostream绑定到std::cout或std::ofstream对象,具体取决于特定的程序条件? 虽然这个失效的原因很多,但是我想达到的东西在语义上等同于以下几点: std::ostream out = condition ? &std::cout : std::ofstream(filename); 我见过一些不是exception安全的例子,比如http://www2.roguewave.com/support/docs/sourcepro/edition9/html/stdlibug/34-2.html : int main(int argc, char *argv[]) { std::ostream* fp; //1 if (argc > 1) fp = new std::ofstream(argv[1]); //2 else fp = &std::cout //3 *fp << "Hello world!" << std::endl; //4 if (fp!=&std::cout) delete fp; } 有谁知道一个更好的,exception安全的解决scheme?
我习惯于Delphi VCL框架,其中TStreams抛出错误的例外(例如文件未find,磁盘已满)。 我正在移植一些代码来使用C ++ STL来代替,而且iostreams不会在默认情况下抛出exception,而是设置badbit / failbit标志 。 两个问题 a:为什么会这样 – 从第一天开始,对于一个有例外的语言来说,这似乎是一个奇怪的devise决定? b:如何最好地避免这种情况? 我可以生产出像我所期望的那样的垫片类,但是这感觉就像重新发明了轮子。 也许有一个BOOST库,这是一个更安全的方式吗?
我怎样才能打印0x0a,而不是使用cout 0xa? #include <iostream> using std::cout; using std::endl; using std::hex; int main() { cout << hex << showbase << 10 << endl; }
我有一个C ++程序: #include<iostream> int main() { char t = 'f'; char *t1; char **t2; cout<<t; //this causes an error, cout was not declared in this scope return 0; } g ++ test.cpp 我得到错误error: 'cout' was not declared in this scope 为什么?
我正在寻找一个类似于iostreams的库,它执行转换,并允许写入内存缓冲区,文件和控制台。 但是,我想要一些types安全的,如iostream。 有没有严重的图书馆这样做? 能够指定输出编码的东西将是一个加号。 请注意,我并不对仅仅面向iostreams的库感兴趣,因为它们只是增加了iostream正在做的复杂性,例如boost::format 。 PreEmptive评论回应:我不想使用cstdio,因为使用该系统是不可能的代码输出位置不可知的。 也就是说,你必须调用一个函数来发送缓冲区,而且你必须调用另一个函数来发送文件,另一个用于控制台等等。 编辑2:在回应下面的评论乱七八糟:我厌倦了iostreams和cstdio。 这是更具体的原因。 我试图保留这个问题的“咆哮”,但是人们总是问我是否离开了我的摇杆,所以这是我的理由。 cstdio 无法正确处理Unicode字符 如果不进行手动缓冲区pipe理,就不能写入类似string的东西 通常需要支持非标准扩展(例如vsnprintf )才能使用(编辑:好的,现在C99中的C99标准库增加了大部分/全部) 在不改变原始代码的情况下,不能改变输出的位置(非标准扩展,例如在glibc中允许你把文件指针当作缓冲区,这种做法是这样的…但是它仍然是一个非标准的扩展) 使安全“有趣”(到整个章节专注于安全文档解释问题,例如“printf”的格式string等) 不安全 input输出stream 慢 对于客户来说太复杂了。 如果只使用标准库中的内容,那么这是非常好的,但是尝试扩展内容几乎是不可能的。 我阅读了整个“标准C ++ IOStreams和Locale”书籍,这本书看起来是唯一一本关于这个主题的书籍 – 两次 – 我仍然不知道发生了什么。 我喜欢iostreams的概念,甚至使用operator<<有些人似乎不喜欢,但似乎完全过于devise给我。 有人不应该花费无数小时阅读书籍来成为你图书馆的简单客户。 当然,如果你正在添加一个新的输出源或者我能理解的东西,但是……客户端应该被屏蔽掉。 (这不是什么图书馆的?) 这是C ++中唯一令人痛苦的事情,在其他编程语言中“正常工作”,我认为没有理由变得复杂。
除了std::ios_base::Init之外,标准C ++库中的所有名称都是小写字母。 为什么是这样?
这个文件中提到的<iosfwd>头是什么? 为什么有必要? 任何例子?
在cout,cin,cerr和clog名字中,“c”是什么意思? 我会说char但我还没有find任何证实。
常见的std :: cin用法 int X; cin >> X; 这个的主要缺点是X不能是const 。 它可以很容易地引入错误; 我正在寻找一些技巧来创build一个const值,并只写一次。 天真的解决scheme // Naive int X_temp; cin >> X_temp; const int X = X_temp; 你可以通过改变X来const&来改善它。 仍然可以修改原来的variables。 我正在寻找如何做到这一点的简短而巧妙的解决scheme。 我相信我不是唯一能从这个问题的答案中得到好处的人。 //编辑:我想解决scheme很容易扩展到其他types(比方说,所有PODs, std::string和可移动的可复制类与微不足道的构造函数)(如果它没有意义,请让我知道评论)。
我得到所有cout和endl这些错误信息: main.cc:17:5: error: 'cout' was not declared in this scope main.cc:17:5: note: suggested alternative: /usr/include/c++/4.6/iostream:62:18: note: 'std::cout' 遵循这个build议,一切都很好。 现在我很好奇,为什么我必须这样做。 我们之前在类中使用了C ++,但是我从来std::在任何这些命令之前写入std:: 。 这个系统可能有什么不同?