3

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で簡単な実行可能ファイルを開く方法がわからないかもしれません。私が欲しいのは、それをダブルクリックして、2つの簡単なメッセージが表示されたコンソールを表示することです。私が間違っているのは何ですか?ありがとう!

また、g++を使用してcppファイルをコンパイルします。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で実行されます。

NB私はあなたの移植性のないコードを修正std::してからの名前に修飾を使用するようにしました<cstdio>

于 2012-12-10T21:43:31.093 に答える
2

stdioがコンソールで動作する唯一の方法であるため、Windowsはコンソールを開きます。Linuxは、stdioがなくても機能できるため、Linuxは機能しません(デフォルトでは、出力はXセッションエラーログに送ら~/.xsession-errorsれます)。ユーザーがstdioにアクセスできるようにする場合は、最初にターミナルとシェルを開き、そこで実行可能ファイルを実行する必要があります。

于 2012-12-10T21:39:34.540 に答える
1

デスクトップ環境に、ターミナルウィンドウでプログラムを実行するように指示していません。あなたのプログラムも教えてくれません、それはただその標準出力に書き込むだけです。

プログラムの標準出力を表示するには、コンソールを開き、コンパイルされたプログラムの名前を入力して実行するのが最善です。プログラムの標準出力が同じウィンドウに表示されます。

于 2012-12-10T21:37:46.517 に答える
0

代わりは

cin.ignore();

する

cin.get();

コンパイルを行ったディレクトリで、次のコマンドを使用してターミナルウィンドウでプログラムを起動します。

./test

次に、標準出力に「ファイルの書き込み...」と「任意のキーを押して終了...」と書き込みます。アプリを終了するには、任意のキーを押す必要があります。

于 2012-12-10T21:37:54.713 に答える