Linux中的Cout和Cin - 看不到控制台

时间:2012-12-10 21:33:09

标签: c++ linux console cout

我刚刚从Windows迁移到Linux,我尝试创建一个简单的应用程序,打开控制台,显示消息并等待按键关闭。我在Windows上创建它并且它可以工作,然后我只是将文件移动到Linux。没有做任何改变,只是用g ++编译它,我没有错误。问题是在Linux(Ubuntu 12.04)上我无法看到控制台和一些消息要求我在关闭前按任意键。我的代码就像这样简单:

#include <iostream>
#include <cstdio>

int main() {
    cout << "Writing file...\n";

        FILE *myfile = fopen("testfile.txt", "w");
        fwrite("test", sizeof(char), 4, myfile);
        fclose(myfile);

    cout << "Press any key to exit...\n";
    cin.ignore();
    return 0;
}

在Windows上,当我启动可执行文件时,控制台窗口会显示消息并在按任意键时关闭。在Linux上,当我执行程序时,我什么都没得到。它确实创建了testfile.txt文件并插入了文本,因此 cstdio 相关的功能确实有效,但我看不到任何带有这些消息的控制台,我不明白为什么。也许我不知道如何在Linux上打开一个简单的可执行文件。我想要的是双击它,看到一个包含两个简单消息的控制台。你瘦了我做错了什么?谢谢!

另外,我使用g ++编译cpp文件:g++ -Wall -s -O2 test.cpp -o test

4 个答案:

答案 0 :(得分:8)

在Windows上,应用程序的“自然”形式是GUI应用程序。运行控制台应用程序时,系统会创建一个窗口来运行控制台并在该窗口中运行应用程序。这是由Windows完成的,它不是C ++的固有属性,并不是您编写的代码所暗示的。

C ++不会自动执行此操作,类UNIX系统不会为您执行此操作。

在类UNIX系统上,“自然”类型的应用程序(可以说)是一个控制台应用程序,您通常可以从控制台或终端运行它们。

运行程序时,输出会转到运行X11会话的终端,但由于X11会话正在控制您的显示,因此您看不到它。

因此,要获得所需的行为,请首先打开终端,然后运行该程序。

要使程序在终端中运行,请尝试运行类似xterm -e ./test

的内容

为了实现自动化,您可以使用以下内容进行克制:

#include <iostream>
#include <string>
#include <unistd.h>
#include <cstdio>

int main(int argc, char** argv)
{
  if (argc > 1 && std::string(argv[1]) == "-xterm")
  {
    if (::execl("/usr/bin/xterm", "xterm", "-e", argv[0], (char*)NULL))
    {
      std::perror("execl");
      return 1;
    }
  }

  std::cout << "Writing file...\n";

  FILE* myfile = std::fopen("testfile.txt", "w");
  std::fwrite("test", sizeof(char), 4, myfile);
  std::fclose(myfile);

  std::cout << "Press any key to exit...\n";
  std::cin.get();
}

现在,如果您使用参数-xterm运行程序,它将在xterm中运行。

N.B。我修复了您的不可移植代码,以便对std::

中的名称使用<cstdio>限定条件

答案 1 :(得分:2)

Windows打开一个控制台,因为这是stdio将在其上运行的唯一方式。 Linux没有,因为stdio可以在没有它的情况下运行(输出转到X会话错误日志,默认情况下为~/.xsession-errors)。如果你想让用户可以访问stdio,那么你需要先打开一个终端和shell,然后在那里运行可执行文件。

答案 2 :(得分:1)

您尚未告知桌面环境在终端窗口中运行该程序。你的程序也没有告诉它,它只是写入它的标准输出。

要查看程序的标准输出,最好是打开控制台,然后键入要运行它的已编译程序的名称。程序的标准输出将显示在同一窗口中。

答案 3 :(得分:0)

代替

cin.ignore();

做一个

cin.get();

在您编译的目录中,使用以下命令在终端窗口中启动程序:

./test

然后在标准输出上写下“写入文件...”和“按任意键退出...”,您需要按任意键才能终止该应用程序。