mac os 程序对拍(同Linux对拍) 以及c++文件读入
在网上翻了好久发现Windows和Linux下的程序对拍都有很多博客, 而macos下的寥寥无几, 自己摸索了一下发现macos和Linux基本相同。
准备:
test1.cpp //算法程序1
test2.cpp //算法程序2
data.cpp //数据生成器
compare.cpp //比较程序
前三个cpp大家肯定都知道怎么写, 最主要的是如何自动compare, 并且直观, 方便我们查错。
compare程序:
/********************************************
*Author* :ZZZZone
*Created Time* : 日 11/19 18:10:24 2017
*********************************************/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
#include <fstream>
#include <cassert>
#include <string>
using namespace std;
typedef pair<int, int> PII;
typedef long long LL;
typedef unsigned long long ULL;
void readData(string file)
{
ifstream infile;
infile.open(file.data()); //将文件流对象与文件连接起来
assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行
string s;
while(getline(infile,s))
{
cout<<s<<endl;
}
infile.close(); //关闭文件输入流
}
void readans(string file1, string file2){
ifstream infile1, infile2;
infile1.open(file1.data());
infile2.open(file2.data());
assert(infile1.is_open());
assert(infile2.is_open());
string s1, s2;
while(getline(infile1, s1) && getline(infile2, s2)){
bool flag = false;
if(s1 != s2) flag = true;
if(flag) printf("------------------\n");
cout << s1 << " | " <<s2 << endl;
if(flag) printf("------------------\n");
}
infile1.close();
infile2.close();
}
int main(){
for (int i=1;;i++){
printf("The result of No. %d Case is: ",i);
system("/Users/zong/代码/vimcode/data");//程序路径
system("/Users/zong/代码/vimcode/std");
system("/Users/zong/代码/vimcode/test");
if (system("diff std.out test.out")){
printf("Wrong Answer\n");
printf("\n");
readData("/Users/zong/代码/vimcode/data.in");
//直接输出数据和答案, 方便比较
readans("/Users/zong/代码/vimcode/std.out", "/Users/zong/代码/vimcode/test.out");
//同步输出两组数据, 方便对比查看。
return 0;
}
else printf("Accepted\n");
}
return 0;
}
通常默认保存路径为 ./
也就是ubuntu和macos的home下, 但是我用macvim直接编译系统无法识别./
,用终端运行反而可以, 因为我平时都是用gui的macvim, 很少用终端, 所以我直接把路径写全了,把./
展开为/Users/zong(用户名)/
再后面就是具体cpp保存路径了。
附上各种文件读入:
所需头文件:
#include <iostream>
#include <fstream>
#include <cassert>
#include <string>
- 逐行读入
void readTxt(string file)
{
ifstream infile;
infile.open(file.data()); //将文件流对象与文件连接起来
assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行
string s;
while(getline(infile,s))
{
cout<<s<<endl;
}
infile.close(); //关闭文件输入流
}
- 逐个字符读入(忽略空格与回车)
void readTxt(string file)
ifstream infile;
infile.open(file.data()); //将文件流对象与文件连接起来
assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行
char c;
while (!infile.eof())
{
infile >> c;
cout<<c<<endl;
}
infile.close(); //关闭文件输入流
}
- 逐个字符读入(包括空格与回车)
void readTxt(string file)
{
ifstream infile;
infile.open(file.data()); //将文件流对象与文件连接起来
assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行
char c;
infile >> noskipws;
while (!infile.eof())
{
infile>>c;
cout<<c<<endl;
}
infile.close(); //关闭文件输入流
}