gpt4 book ai didi

java - 将 gcc 编译状态保存到 Java 的文本文件

转载 作者:行者123 更新时间:2023-11-30 11:58:57 24 4
gpt4 key购买 nike

我正在通过 Java 制作一个 C 评估程序,其中有一堆 C 的编程问题,它让用户以 C 代码的形式输入答案,然后按“编译”按钮,这是链接到通过 gcc 运行用户输入代码的 bat 文件。

我已经得到了输入和编译工作,但我需要从编译器中获取输出并将其打印到程序中的文本区域。我可以编译一个简单的“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,“compiled”是输出的文本区域。

我的批处理文件是:

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() 添加“START”就无法打开命令提示符, 但在程序完成运行之前出现框架。

此外,如果编译因错误而失败,我将如何获得编译器的输出?如果失败,我目前在我的批处理文件中获取它的方式不会将任何内容放入文本文件。

最佳答案

编译器可能会将其错误消息写入 stderr 而不是 stdout。由于您没有重定向 stderr,因此您显然在文件中看不到任何内容。您可以使用 2> 而不是 >(这是隐含的 1>)来重定向 stderr。

如果程序需要用户输入但不应该这样做,您可以将 NUL 重定向到程序调用中(基本上不提供输入):

demo < nul > output.txt

鉴于您显然想要对执行的内容进行一些控制,我建议您不要在此处使用批处理文件。相反,您可以通过 Java 启动各个进程(编译器和程序本身),直接捕获它们各自的输出。在这里浏览文件实际上是不必要的。你可以使用

gcc -x c -o demo -

直接从标准输入读取程序。

关于java - 将 gcc 编译状态保存到 Java 的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2842178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com