2013-02-13 118 views
12

std::cout << "hello"不起作用有什么情况吗?我有一个c/C++代码,但std::cout不打印任何东西,甚至不包含常量字符串(如“hello”)。std :: cout将不打印

有没有方法可以检查cout是否能够打开流?有一些成员功能,如good(),bad(),...但我不知道哪一个适合我。

+7

啊,缓冲输出,尽管艺术是一个无情和残酷的丫头。 – WhozCraig 2013-02-13 16:33:16

+3

C中没有'std :: cout'。 – 2013-02-13 17:03:41

+0

在窗口系统中,'std :: cout'可能无法实现,因为有窗口,操作系统不知道要输出到哪个窗口。 – 2013-02-13 20:23:14

回答

29

确保你刷新了流。这是必需的,因为输出流是缓冲的,并且您无法保证缓冲区何时被刷新,除非您自己手动刷新它。

std::cout << "Hello" << std::endl; 

std::endl将输出一个换行符并刷新流。或者,std::flush只是做的冲洗。

std::cout.flush(); 
+1

+1或者使用'std :: cout <<“hello \ n”' – 2013-02-13 16:33:17

+0

没有区别:( – mahmood 2013-02-13 16:37:46

+3

@GrijeshChauhan既然何时发送一个换行符char到一个格式化输出流强制刷新?我认为标准不是内容意识到冲洗,依靠成员('flush()')和操纵器('endl')来触发一个流缓冲区刷新?从一个特定的C++标准开始,它是这样吗? – WhozCraig 2013-02-13 16:37:52

5

这是可能的std::cout不起作用由于缓冲(你正在写的std::cout缓冲区,而不是在输出端上):冲洗,也可以使用流的成员函数来完成。

你可以做这些事情之一:

  • 冲洗std::cout明确:

    std::cout << "test" << std::flush; // std::flush is in <iostream> 
    

    std::cout << "test"; 
    std::cout.flush(); // explicitly flush here 
    

    std::cout << "test" << std::endl; // endl sends newline char(s) and then flushes 
    
  • 改为使用std::cerrstd::cerr未被缓冲,但它使用了不同的流(即如果您对“在控制台上查看消息”感兴趣的话,第二种解决方案可能不适用于您)。

+0

他们都没有在我的代码工作。 – 2016-12-12 18:52:04

1

为了有效地禁用缓冲您可以拨打此:

std::setvbuf(stdout, NULL, _IONBF, 0); 

或者,您也可以打电话给你的程序,并在命令行禁用输出缓冲:

stdbuf -o 0 ./yourprogram --yourargs 

请记住,这通常不会因性能原因而完成。