3

I just moved from Windows to Linux and I'm try to create a simple application that opens a console, displays a message and wait for key press to close. I have created it on Windows and it works, then I just moved the files to Linux. Didn't make any change, just compiled it with g++ and I get no errors. The problem is that on Linux (Ubuntu 12.04) I can't see the console and some message asking me to press any key before closing. My code is as simple as this:

#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;
}

On Windows, when I start the executable, the console windows will show me the messages and close when pressing any key. On Linux, when I execute the program I don't get anything. It does create the testfile.txt file and insert the text, so cstdio related functions does work, but I can't see any console with those messages and I don't understand why. Maybe I don't know how to open a simple executable on Linux. What I want is to double click on it and see a console with two simple messages. What do you thin I'm doing wrong? Thanks!

Also, I use g++ to compile the cpp file: g++ -Wall -s -O2 test.cpp -o test

4

4 回答 4

7

在 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 中运行。

注意我修复了您的非便携式代码以std::对来自的名称使用限定符<cstdio>

于 2012-12-10T21:43:31.093 回答
2

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

于 2012-12-10T21:39:34.540 回答
1

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

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

于 2012-12-10T21:37:46.517 回答
0

反而

cin.ignore();

做一个

cin.get();

在您进行编译的目录中,在终端窗口中启动程序:

./test

然后它会在标准输出上写入“Writing file...”和“Press any key to exit...”,您需要按任意键来终止应用程序。

于 2012-12-10T21:37:54.713 回答