【问题标题】:Cout and Cin in Linux - can't see the consoleLinux 中的 Cout 和 Cin - 看不到控制台
【发布时间】:2012-12-10 21:33:08
【问题描述】:

我刚从 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

【问题讨论】:

  • 您发布的代码甚至无法编译。但如果是这样,您将拥有一个名为 test 的可执行文件,您可以通过在其所在目录中键入 ./test 从控制台执行它。
  • 听起来你是从桌面 gui 运行它 - Linux 上使用的不止一个,你可能需要指定哪一个(或至少你正在使用的发行版)。
  • 对不起,我一个字母一个字母地输入了代码,我可能插入了一些错误的字符。代码编译,这不是问题。正如我所说,fwrite 有效,它创建了一个文本文件。我看不到的是一个向我显示消息的控制台。我不想为此使用终端,我只想单击它并打开带有消息的控制台

标签: c++ linux console cout


【解决方案1】:

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

注意我修复了您的不可移植代码以对来自 &lt;cstdio&gt; 的名称使用 std:: 限定符

【讨论】:

  • 很好的exec 例子。不幸的是,我无法再次投票。
【解决方案2】:

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

【讨论】:

  • 我可以创建一个 shell 脚本来打开可执行文件,然后,我的意思是,让它成为一个点击并打开应用程序
  • 那无济于事。同样的事情也会发生。创建一个 .desktop 文件,而不是在终端中运行它。
  • 我认为你是对的。因此,无法从可执行文件中打开终端,然后显示消息。如果我想输出到屏幕,我首先必须打开终端,然后从中执行程序。假设这就是 Linux 上的工作方式。
  • @juanchopanza,不需要fork,只需exec 用运行相同二进制文件的xterm 替换当前进程
  • @juanchopanza,我已经用一个这样做的例子更新了我的答案
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    改为

    cin.ignore();
    

    做一个

    cin.get();
    

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

    ./test
    

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

    【讨论】:

    • aerhm... 为什么投反对票?我进行了替换,因为这样流程就会停止,因此他实际上可以看到正在发生的事情并且必须按任意键才能继续流程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2020-01-23
    • 2015-11-13
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多