我欠大王一个leetcode(之四)——综合C的文件操作和Java线程实现一个小小的测试

-----------------2018.2.9----------------

问过女王大人,她说多线程对单例模式的Runtime的争夺不会影响到对C文件的编译结果。

process.waitFor()的作用是啥?

今天没啥进度。一份乱七八糟只有我本人才能看懂的半成品如下。明天需要打磨它,搞搞C的文件操作,并复习Thread的概念。

package cn.edu.nju.zyf.cmddemo;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;

public class ThreadDemo {
	public static void main(String[] args) {
		
		Process process = null;
		try {
			BufferedReader br1 = null;
			BufferedReader br2 = null;
			//假设学号.c文件从学生处来,caller.c文件从老师处来。
			//TODO 第一步,编译连接学生的程序与老师的main(该main位于/caller)
			String compileCommand = "gcc d:\\gcc-workspace\\MF1732202.c d:\\gcc-workspace\\caller\\caller.c -o d:\\gcc-workspace\\test_result\\MF1732202\\hehehe411.exe";
			process = Runtime.getRuntime().exec(compileCommand);
			process.waitFor();
			
			br1 = new BufferedReader(new InputStreamReader(process.getInputStream()));
			br2 = new BufferedReader(new InputStreamReader(process.getErrorStream()));
			
			String infoLine = null;
			String errorLine = null;
			String infoMessage = "";
			String errorMessage = "";
			File infoFile = new File("D:\\gcc-workspace\\test_result\\MF1732202\\INFO.txt");
			File errorFile = new File("D:\\gcc-workspace\\test_result\\MF1732202\\ERROR.txt");
			FileWriter infoFileWriter = new FileWriter(infoFile);
			FileWriter errorFileWriter = new FileWriter(errorFile);
			
			while((infoLine = br1.readLine())!=null) {
				System.out.println(infoLine);
				infoMessage = infoMessage + infoLine+"\n";
			}
			infoFileWriter.write(infoMessage);
			
			while((errorLine = br2.readLine())!=null) {
				System.out.println(errorLine);
				errorMessage = errorMessage + errorLine+"\n";
			}
			errorFileWriter.write(errorMessage);
			
			
			
			br1.close();
			br2.close();
			infoFileWriter.close();
			errorFileWriter.close();
			
			System.out.println(process.exitValue());
			if(process.exitValue()!=0) {
				return;
			}
			
			//第二步,跑一下那个生成的exe。该动作会产生result.txt
			System.out.println("Here is step 2");
			String runCommand = "d:\\gcc-workspace\\test_result\\MF1732202\\hehehe411";
			process = Runtime.getRuntime().exec(runCommand);
			//process.waitFor();//我也不知道为什么要注释掉这一行,但是注释掉它之后功能就有了……否则功能就体现不出来……
			
			//TODO 第三步,使用java,将D:\gcc-workspace\test_case\output.txt的内容与D:\gcc-workspace\test_result\MF1732202\result.txt的内容进行逐行对比,并将分数写入分数文件
			//一定需要修改。
			System.out.println("Here is step 3");
			String type = "double";//当参数
			int numOfTestCases = 3;//当参数
			File expected = new File("D:\\gcc-workspace\\test_case\\output.txt");
			File actual = new File("D:\\gcc-workspace\\test_result\\MF1732202\\result.txt");
			Reader expectedReader = new FileReader(expected);
			Reader actualReader = new FileReader(actual);
			BufferedReader expectedBufferedReader = new BufferedReader(expectedReader);
			BufferedReader actualBufferedReader = new BufferedReader(actualReader);
			int same = 0;
			if(type.equals("double")) {
				for(int i = 0;i<numOfTestCases;i++) {
					String expectedLine = expectedBufferedReader.readLine();
					String actualLine = actualBufferedReader.readLine();
					double expectedResult = Double.parseDouble(expectedLine);
					double actualResult = Double.parseDouble(actualLine);
					if(Math.abs(expectedResult-actualResult)<1e-4) {
						same++;
					}
				}
			}
			if(type.equals("string")) {
				for(int i = 0;i<numOfTestCases;i++) {
					String expectedLine = expectedBufferedReader.readLine();
					String actualLine = actualBufferedReader.readLine();
					if(expectedLine.equals(actualLine)) {
						same++;
					}
				}
			}
			if(type.equals("int")) {
				for(int i = 0;i<numOfTestCases;i++) {
					String expectedLine = expectedBufferedReader.readLine();
					String actualLine = actualBufferedReader.readLine();
					if(expectedLine.equals(actualLine)) {
						same++;
					}
				}
			}
			expectedBufferedReader.close();
			actualBufferedReader.close();
			expectedReader.close();
			actualReader.close();
			double score = ((double)same/(double)numOfTestCases)*100.0;
			File scoreFile = new File("D:\\gcc-workspace\\test_result\\MF1732202\\score.txt");
			FileWriter scoreFileWriter = new FileWriter(scoreFile);
			scoreFileWriter.write(score+"");
			scoreFileWriter.close();
			
			//TODO 第四步,将正常信息、错误信息和得分传输到数据库
			//先搁置。等设计好数据库再说吧……
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally {
			System.out.println("Here is finally");
			if(process!=null) {
				process.destroy();
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值