没有控制台输出在cout上。

7

我在使用Eclipse IDE for C/C++ Developers时遇到了一个问题。

我正在编写一个用于转换字符串的小工具。在测试过程中,eclipse停止输出控制台。 例如:
cout<<"test";
无法显示。

但并非在所有地方都出现这个问题... 另一个例子:

// File path as argument
int main(int argc, char* argv[]) {
if (argc != 2) {
    cout
            << "ERROR: Wrong amount of arguments! Only one allowed...\n";
    cout << "\n" << "Programm closed...\n\n";
    exit(1);
}

CommandConverter a(argv[1]);
cout<<"test";
a.getCommandsFromCSV();
cout<<"test2";

return 0;
}

如果参数缺失,错误消息会正确显示。 但是如果参数存在且程序继续测试输出:
cout<<"test"; cout<<"test2";
则不会显示... 我是否漏掉了什么明显的东西?

我没有使用过Eclipse,但是你确定你的代码运行正常吗?如果碰巧在'CommandConverter a(argv[1]);'这一行崩溃了,并且你没有收到任何崩溃通知,那么你将看不到任何输出。 - Vikram.exe
如果您在命令行上运行会发生什么? - Nim
我目前只在命令行上运行它...但是通过eclipse控制台完成这个操作...应该是一样的,不是吗?- 代码在那里不会崩溃...它稍后会做很多事情...为了进一步分析,我需要输出。如果我调试并通过那个点,就什么也不会显示 :/ - Beasly
尝试将 cout 更改为 cerr,然后查看是否可以看到输出。 - Nim
1
解决方案是在结尾处使用endl;请参见下面的答案。 - Beasly
显示剩余3条评论
7个回答

12

在输出字符串的末尾添加换行符,例如:`cout << "test\n"``。原因是标准输出进行了缓存,并且当遇到换行符时缓存会被刷新。可能存在一种方法可以在不输出换行符的情况下刷新 cout 缓存,但我无法立即想起它。可能需要通过 rdbuf 方法访问底层 streambuf。


5
你尝试过像Ismail说的那样使用std::endl吗?这实际上应该会刷新输出缓冲区。'\n'不会有这个效果。 - stijn
2
@Beasly,因为输出被刷新到操作系统中,当程序退出时,操作系统会负责刷新缓冲区(即在控制台上显示)。endl修复问题的原因是除了刷新到操作系统外,操作系统缓冲区可能也会被刷新。我问你在gdb中是否逐步执行的原因是依赖于cout进行调试是一种相当基本的方法,并容易遇到你遇到的这种情况。使用调试器逐步执行是确定某些东西是否正常工作的更好方法... - Nim
1
可能存在一种方法可以刷新cout缓冲区而不输出换行符,但我并不是很清楚。<< flush(真的不难记) - gx_
非常好用,谢谢! - Yehonatan
对我没用,我还明确调用了 flush(),但它仍然没有打印任何东西。 - hudac
显示剩余2条评论

3
对我来说,安装32位版本的Eclipse(Indigo 3.7)和32位Java JDK / JRE并没有起作用。 我使用了来自 Eclipse CDT / User / FAQ 的更快解决方案:

引用自Eclipse CDT / User / FAQ- Windows上的Eclipse控制台不显示输出

Eclipse console does not show output on Windows In Eclipse CDT on Windows, standard output of the program being run or debugged is fully buffered, because it is not connected to a Windwos console, but to a pipe. See bug 173732 for more details. Either add fflush calls after every printf or add the following lines in the start of the main function:

setvbuf(stdout, NULL, _IONBF, 0); 
setvbuf(stderr, NULL, _IONBF, 0);

1
这个 Windows 解决方法也适用于在 Ubuntu 12.10 64 位上使用 CDT 6.0 的 Eclipse 3.8 64 位。 - Lucas

2

我曾经遇到过类似的问题。在我的情况下,程序可以在命令行中运行并输出结果,但不能在eclipse控制台中输出。解决方法是使用32位版本的eclipse而不是64位版本。

我看过一些资料,说这是一个bug。虽然可能不是完全相同的问题。


0
当我在微软网站上发现这个http://support.microsoft.com/kb/94227时,我也正在寻找这些信息。
我认为一个简单的方法是在需要强制刷新cout使用的内部缓冲区时使用std::flush。
*std::cout << ... << std::flush;*

0

当你调试代码时,直到最后才看到输出结果,就会出现这种情况。

cout<<"what ever overloads"<< flush;

为了立即在标准输出(控制台)上查看输出


-2

嗨,经过一些类似的挣扎后,我发现项目属性环境PATH变量的第一个元素必须是"C:\MinGW\bin;"。否则可能会使用错误的版本,特别是如果您使用不同的编译器。


-5
尝试在每行开头输出一个空格
cout << " " << .....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接