У меня есть проект Java, который я разработал в окнах. Теперь, я хочу сделать это независимым от платформы.
Часть проекта: это берет c программу и выполняется. берет вход из файла и дает вывод в файле, затем сравнивает выходной файл с другим файлом и дает результат.
Сначала у меня есть класс, который работает .cpp
файл и производит исполняемый файл. Как далеко я знаю, команда для этой работы - то же в обоих окнах и человечности, и это:
g++ -std=c++11 -o <name of executable file> <path of .cpp file>
Используя вышеупомянутую команду, это работает хороший терминал использования. Но при реализации того же самого в коде, это дает ошибку компиляции. Это означает следующие ошибки:
g++: fatal error: no input files
См. изображение, чтобы быть более ясными:
package judgecpp;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Path;
import java.nio.file.Paths;
class CodeCompile implements Runnable, RunInCmd {
Thread compilerThread;
private final File fileCPP;
public File file;
public boolean errorHas;
public CodeCompile(File fileCPP) {
this.fileCPP = fileCPP;
file = new File(String.format("compiledFile%d", CodeProcessing.getNewFileNumber()));
compilerThread = new Thread(this, "compilerThread");
}
@Override
public Process cmdRun(String command) throws IOException {
Runtime rt;
Process pr;
rt = Runtime.getRuntime();
pr = rt.exec(command);
return pr;
}
@Override
public void run() {
try {
String command = String.format("g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"");
// if(VerdictGiver.os.equals("uni")) command = String.format("g++ -std=c++11 \"" + fileCPP.toString() + "\" -o \"" + file.toString() + "\"");
// command = "pwd";
System.out.println("Code Compile: "+command);
System.out.println("OS: "+VerdictGiver.os);
Process pr = cmdRun(command);
Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
errorHas = false;
System.out.println("Compile Error Stream starts -----------------------------------------");
while (input.readLine() != null) {
System.out.println(input.readLine());
errorHas = true;
}
System.out.println("Compile Error Stream ends -------------------------------------------");
} catch (IOException ex) {
// Logger.getLogger(CodeCompile.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Я сложен здесь в течение долгого времени.
Я получил решение, но не знайте, почему оно работает. Вместо строки:
String command = String.format("g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"");
Я использовал следующую строку:
String command = String.format("cmd /c \"g++ -std=c++11 -o \"" + file.toString() + "\" \"" + fileCPP.toString() + "\"\"");
Это означает, что сгенерированная строка была бы похожа:
cmd /c "g++ -std=c++11 -o "compiledFile0" "Submissions/20_masd_0_2015_09_14_01_09_58.cpp""
Но в случае запущения программы, ни одна из следующих строк не работает:
Сначала (этот хорошо работает в терминале):
"./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"
Во-вторых:
cmd /c ""./compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""
В-третьих:
cmd /c ""compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt""
В-четвертых:
"compiledFile0"<"/home/mamun/Desktop/ContestSettings/icpc2015-data/artichoke/12.in">"output1.txt"
Но на этот раз никакая удача, нуждаться в помощи.