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

ali*_*ali 4 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*ely 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();
}
Run Code Online (Sandbox Code Playgroud)

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

注意我修复了你的非可移植代码,以便使用std::来自的名称<cstdio>