2012-12-10 43 views
3

我剛剛從Windows移到Linux,我嘗試創建一個簡單的應用程序,它打開控制檯,顯示消息並等待按鍵關閉。我已經在Windows上創建了它,它可以工作,然後我只是將這些文件移動到Linux。沒有做任何改變,只是用g ++編譯它,我沒有任何錯誤。問題是,在Linux(Ubuntu 12.04)上,我看不到控制檯,並且有消息要求我在關閉前按任意鍵。我的代碼是如此簡單:Cout和Cin在Linux中 - 看不到控制檯

#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

+2

中的名稱使用std::資格。您發佈的代碼甚至不會編譯。但是如果這樣做了,你將會得到一個名爲'test'的可執行文件,你可以通過從它所在的目錄輸入'。/ test'從控制檯執行它。 – juanchopanza

+1

這聽起來像是你從桌面gui運行它 - Linux上使用的不止一個,你可能需要指定哪一個(或者至少是你正在使用的發行版)。 –

+0

對不起,我按字母鍵入了代碼,我可能插入了一些錯誤的字符。代碼編譯,這不是問題。正如我所說的,fwrite的作品,它創建一個文本文件。我無法看到的是一個控制檯向我顯示消息。我不想用這個終端,我只是想點擊它,並打開控制檯上的信息 – ali

回答

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中運行。

N.B.我修復了您的不可移植代碼對<cstdio>

+0

不錯的'exec'示例。不幸的是我不能第二次投票。 – juanchopanza

1

你沒有告訴你的桌面環境,在終端窗口中運行該程序。你的程序也不會告訴它,它只是寫入其標準輸出。

要查看程序的標準輸出,最好打開一個控制檯,然後鍵入編譯後的程序的名稱來運行它。程序的標準輸出將顯示在同一個窗口中。

0

代替

cin.ignore(); 

cin.get(); 
在你做的編譯目錄

,在終端窗口中啓動程序:

./test 

它,然後寫道:「寫作文件...「和」按任意鍵退出...「標準輸出,您需要按任意鍵終止e應用程序。

+0

aerhm ...爲什麼downvote?我做了替換,因爲這種方式的過程停止,所以他可以真正看到發生了什麼,並必須按任意鍵來繼續進程 –

+0

不是我。但是,它仍然無效 – ali

+0

@ali:請參閱編輯。添加了一些更多來澄清 –

2

Windows打開一個控制檯,因爲這是stdio工作的唯一方式。 Linux沒有,因爲stdio沒有它可以正常工作(輸出到X會話錯誤日誌,默認爲~/.xsession-errors)。如果你想讓用戶可以訪問stdio,那麼你需要首先打開終端和shell,然後在那裏運行可執行文件。

+0

我可以創建一個shell腳本來打開可執行文件,然後,我的意思是,使其成爲一個點擊並打開應用程序 – ali

+0

這不會有幫助。同樣的事情會發生。創建一個.desktop文件,而不是在終端中運行它。 –

+0

我認爲你是對的。因此,無法從可執行文件打開終端,然後顯示消息。如果我想輸出到屏幕上,我首先必須打開終端,然後從中執行程序。假設這是事情在Linux上的工作方式。 – ali