Сохранить статус компиляции gcc в текстовый файл для Java - PullRequest
2 голосов
/ 16 мая 2010

Я делаю программу оценки C через Java, в которой есть куча вопросов по программированию для C, и она позволяет пользователю вводить ответ в виде кода на C, а затем нажимает кнопку «Compile», которая связан с файлом bat, который запускает код пользовательского ввода через gcc.

У меня работает ввод и компиляция, но мне нужно получить вывод от компилятора и распечатать текстовое поле в программе. Я могу получить простую компиляцию «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 () - это JFrame, который отображает вывод, а «скомпилированный» - это textArea для вывода.

Мой командный файл:

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

Я не уверен, как я могу это сделать, поэтому создается рамка для вывода кода, если код требует ввода данных пользователем, поскольку командная строка не открывается без добавления «START» в .exec () , но затем рамка появляется до завершения работы программы.

Кроме того, как я могу получить выходные данные компилятора, если компиляция не удалась из-за ошибки? То, как я сейчас это сделал в моем пакетном файле, ничего не помещает в текстовый файл, если это не удается.

1 Ответ

1 голос
/ 16 мая 2010

Компилятор, вероятно, записывает свои сообщения об ошибках в stderr вместо stdout. Поскольку вы не перенаправляете stderr, вы, очевидно, ничего не видите в файле. Вы можете перенаправить stderr, используя 2> вместо > (что подразумевается 1>).

Если программа требует ввода данных пользователем и не должна этого делать, вы можете перенаправить NUL в вызов программы (по сути, без ввода):

demo < nul > output.txt

Учитывая, что вы, очевидно, хотите иметь некоторый контроль над тем, что выполняется, я бы посоветовал вам не использовать здесь командный файл. Вместо этого вы можете запускать отдельные процессы (компилятор и саму программу) через Java, захватывая их соответствующие результаты напрямую. Просматривать файлы здесь на самом деле не нужно. Вы можете использовать

gcc -x c -o demo -

для чтения программы напрямую из стандартного ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...