2010-05-16 6 views
2

Je crée un programme d'évaluation C via Java, qui contient un tas de questions de programmation pour C, et permet à l'utilisateur d'entrer une réponse sous forme de code C, et puis appuyez sur un bouton "Compiler", qui est lié à un fichier bat qui exécute le code d'entrée de l'utilisateur à travers gcc.Enregistrer le statut de compilation de gcc dans un fichier texte pour Java

J'ai l'entrée et la compilation fonctionnant, mais j'ai besoin d'obtenir la sortie du compilateur et obtenir cela pour imprimer des textarea dans le programme. Je peux obtenir une simple compilation "Hello, world", mais j'ai de la difficulté à imprimer des programmes nécessitant une entrée utilisateur avec scanf, par exemple.

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); 

    } 
    } 

Ceci est la méthode actionPerformed du bouton « Compiler », le compileCode() est l'DFrame qui affiche la sortie et « compilé » est la zone de texte pour la sortie.

Mon fichier batch est:

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 

Je ne sais pas comment je peux le faire, de sorte que le cadre est créé pour la sortie du code si le code nécessite une entrée utilisateur comme l'invite de commande doesn n'ouvrez pas sans ajouter "START" à .exec(), mais le cadre apparaît avant que le programme ne soit terminé.

De même, comment devrais-je obtenir la sortie du compilateur si la compilation échoue en raison d'une erreur? La façon dont je l'ai dans mon fichier batch pour le moment ne met rien dans un fichier texte s'il échoue.

+0

Enregistrer le contenu du fichier texte dans un tableau, puis l'imprimer dans la zone de texte? – JohnBore

Répondre

1

Le compilateur écrit probablement ses messages d'erreur dans stderr au lieu de stdout. Puisque vous ne redirigez pas stderr, vous ne voyez évidemment rien dans le fichier. Vous pouvez rediriger stderr en utilisant 2> au lieu de > (qui est un 1> implicite).

Si le programme nécessite l'entrée d'utilisateur et ne doit pas faire, vous pouvez rediriger NUL dans l'appel de programme (essentiellement fournissant pas d'entrée):

demo <nul> output.txt 

Étant donné que vous voulez évidemment un certain contrôle sur ce qui est exécuté I Je vous suggère de ne pas utiliser un fichier batch ici. Au lieu de cela, vous pouvez lancer les processus individuels (le compilateur et le programme lui-même) via Java, en capturant leur sortie respective directement. Parcourir des fichiers ici est en fait inutile. Vous pouvez utiliser

gcc -x c -o demo - 

pour lire le programme directement à partir de stdin.

+0

Merci, je vais jouer avec eux. La "démo < nul > output.txt" empêche le programme de se bloquer à cause de process.waitFor() car le compilateur attendait une entrée de l'utilisateur avec scanf, donc c'est le seul problème que j'ai avec le moment. – JohnBore