2010-05-16 82 views
2

我正在通過Java編寫一個C語言評估程序,該程序針對C語言提供了大量編程問題,它允許用戶以C代碼的形式輸入答案,並且然後按下「編譯」按鈕,該按鈕鏈接到通過gcc運行用戶輸入代碼的bat文件。將gcc編譯狀態保存爲Java的文本文件

我已經得到了輸入和編譯工作,但我需要從編譯器獲得輸出,並得到它在程序中打印textarea。我可以得到一個簡單的「Hello,world」編譯,但是我無法獲得需要使用scanf的用戶輸入的程序,例如打印。

else if(e.getSource().equals(compile)){ 



if(questionNumber<1){ 
    JOptionPane.showMessageDialog(programFrame, "Please start the assessment", "Compile Error", JOptionPane.ERROR_MESSAGE); 
    } 
    else{ 
    FileOutputStream fileWrite; 
    try { 
    fileWrite = new FileOutputStream("demo/demo.c"); 
    new PrintStream(fileWrite).println(input.getText());//saves what the user has entered in to a C source file 
    fileWrite.close(); 
    @SuppressWarnings("unused") 
    Process process = Runtime.getRuntime().exec("cmd /c compile.bat");//runs the batch file to compile the source file 
    compileCode(); 
    try{ 
     fileStream = new FileInputStream("demo/output.txt"); 
     inputStream = new DataInputStream(fileStream); 
     bufferRead = new BufferedReader(new InputStreamReader(inputStream)); 

     while((stringLine = bufferRead.readLine())!=null){ 
     compiled.append(stringLine); 
     compiled.append("\n"); 
     } 
     inputStream.close(); 


    } 
    catch(IOException exc){ 
     System.err.println("Unable to read file"); 
     System.exit(-1); 
    } 


    } 
    catch (IOException exc) { 
    JOptionPane.showMessageDialog(programFrame, "Demo file not found", "File Error", JOptionPane.ERROR_MESSAGE); 

    } 
    } 

這是「編譯」按鈕actionPerformed方法,所述compileCode()是一個顯示輸出和「編譯」是輸出的TEXTAREA JFrame中。

我的批處理文件是:

C: 
cd dev-cpp\bin 
gcc.exe H:\workspace\QuestionProgram\demo\demo.c -o demo > H:\workspace\QuestionProgram\demo\compilestatus.txt 
demo > H:\workspace\QuestionProgram\demo\output.txt 

我不知道我怎麼能做到這一點,所以對於代碼的輸出創建框架,如果代碼需要用戶輸入的命令提示符沒有按不向「.exec()」添加「開始」即可打開,但在程序運行完畢之前會顯示框架。

此外,如果編譯因錯誤而失敗,我將如何獲得編譯器的輸出?目前我在批處理文件中獲取它的方式在文本文件失敗時不會放入任何文本文件。

+0

將文本文件內容保存到一個數組,然後將其打印在textarea工作? – JohnBore 2010-05-16 00:42:14

回答

1

編譯器可能會將其錯誤消息寫入stderr而不是stdout。由於你沒有重定向標準錯誤,你顯然在文件中看不到任何東西。您可以使用2>而不是>(暗示1>)重定向stderr。

如果程序需要用戶輸入,不應該這樣做,你可以重定向到NUL程序調用(基本上不提供輸入):

demo <nul> output.txt 

既然你明明想什麼獲取執行我的一些控制'd建議你不要在這裏使用批處理文件。相反,您可以通過Java啓動各個進程(編譯器和程序本身),直接捕獲它們各自的輸出。在這裏瀏覽文件實際上是不必要的。您可以使用

gcc -x c -o demo - 

直接從stdin讀取程序。

+0

謝謝,我會和他們一起玩。 「demo < nul > output.txt」會阻止程序掛起,因爲編譯器正在等待scanf的用戶輸入,因此process.waitFor()會暫停,所以這是我目前遇到的唯一問題。 – JohnBore 2010-05-16 04:17:36