有没有
std::cout << "hello"
不工作的情况?我有一个 c/c++ 代码,但是 std::cout
不打印任何东西,甚至不打印常量字符串(例如“hello”)。
有什么方法可以检查
cout
是否能够/不能打开流?有一些成员函数像good()
,bad()
,...但我不知道哪个适合我。
确保冲洗流。这是必需的,因为输出流是缓冲的,除非您自己手动刷新缓冲区,否则您无法保证何时刷新缓冲区。
std::cout << "Hello" << std::endl;
std::endl
将输出换行符并刷新流。或者,std::flush
将 just 进行冲洗。也可以使用流的成员函数来完成刷新:
std::cout.flush();
std::cout 不适用于 GUI 应用程序!
特定于 MS Visual Studio: 当您需要控制台应用程序并使用 MS Visual Studio 时,将项目属性“Linker -> System -> SubSystem”设置为 Console。在 Visual Studio 中创建一个新的 Win32 项目(对于本机 C++ 应用程序)后,此设置默认为“Windows”,这会阻止 std::cout 将任何输出放入控制台。
要有效地禁用缓冲,您可以调用它:
std::setvbuf(stdout, NULL, _IONBF, 0);
或者,您可以调用程序并在命令行中禁用输出缓冲:
stdbuf -o 0 ./yourprogram --yourargs
请记住,出于性能原因,通常不会这样做。
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::cerr
。 std::cerr
没有缓冲,但它使用不同的流(即,如果您对“查看控制台上的消息”以外的内容感兴趣,则第二种解决方案可能不适合您)。