1 本地测试(文件重定向)
由于笔试oj平台测试的时候的输入都是以文件形式输入,因此如果我们无法以传统方式交互式方式输入。
因此可以文件重定向的方式。通过将输入内容写入文件,再让程序从文件中读取数据,模拟 OJ 的批量输入。此方法适用于多组测试用例、复杂输入格式的场景。
准备好一个包含输入的文件,
将需要测试的c++文件编译成可运行文件。
其中yourprogram.cpp替换成你需要测试的c++源文件;yourprogram.exe为编译后的名字,这个名字可以自定义
g++ yourprogarm.cpp -o yourprogarm.exe
运行编译后的文件,使用管道将input.txt的内容作为程序的输入
Get-Content input.txt | .\yourprogram.exe
此时,input.txt里面的内容将会像手动输入的一样,被程序读取。
2. 常见输入读取
2.1 循环输入
任意个样例作为输入。每个样例的格式固定。
如以下输入,每个样例为一行,每一个样例包含两个数字:
1 11
2 22
3 33
4 44
使用循环输入来读取:
void fun2(){
int i;
while(cin>>i){
int j;
cin>>j;
cout<<"每个样例的输入为"<<i<<" "<<j<<endl;
}
}
输出为:
2.2 第一行输入为任意个,第二行输入为固定个
输入为:
1 2 3 4 5 6
88 77
由于第二行是固定个输入,因此可以使用循环读取的方式先把所有输入读入一个数组。最后再取出数组后k位作为第二行输入。
//第一行输入任意个个数字,第二行输入固定为2个
void fun_dynamic_cin(){
vector<int> book;
int tmp;
while(cin>>tmp){
book.push_back(tmp);
}
//第一行
for(int i=0;i<book.size()-2;i++){
cout<<book[i]<<" ";
}
cout<<endl;
//第二行
for(int i=book.size()-2;i<book.size();i++){
cout<<book[i]<<" ";
}
}
工作台输出:
2.3 输入两行,每一行都为任意个
输入为:
1 2 3 4 5 6
1 3 5 7 9 11 13
由于输入的几行都是不固定个数的数字,因此需要使用getline来读取整一行的字符串,然后对字符串进行切分,获得数字数据。
#include <sstream>
void fun_two_raw_cin(){
string s;
int num;
//读取第一行内容
getline(cin,s);
stringstream ss(s); // 用字符串流分割数字
vector<int> nums;
while (ss >> num) { // 逐个解析数字
nums.push_back(num);
}
for(int i=0;i<nums.size();i++){
cout<<nums[i]<<" ";
}
cout<<endl;
//读取第二行的内容
getline(cin,s);
stringstream ss2(s); // 用字符串流分割数字
vector<int> nums2;
while (ss2 >> num) { // 逐个解析数字
nums2.push_back(num);
}
for(int i=0;i<nums2.size();i++){
cout<<nums2[i]<<" ";
}
}
输出为