我刚刚从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
答案 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
然后在标准输出上写下“写入文件...”和“按任意键退出...”,您需要按任意键才能终止该应用程序。