对C++语言中dos命令的调用及system()函数使用方法的探究

C++ system()函数的使用方法探究


本篇文章实际是一篇休闲娱乐文章,大家有兴趣可以考虑如下问题(可以当做OJ题):

问题

你现在手头有一份个人代码,它十分诡异怎么也不能AC,于是你找来了一份std(标程),用它来进行对拍。当然,你很牛B,几下就把对拍的bat(批处理)文件写出来了。这时你发现dos中的fc比较一直显示无差异,但你并不知道它都测了些什么(即你不知道输入文件,因为它是随机生成的)。于是,你决定想办法把所有测试数据连同你自己与标程的输出整理到形如“dataxxx”的文件夹中。由于测试数据很多,靠人力根本不可能完成这个任务。聪明的你一定能想出解决的办法!

输入

无输入

输出

无输出

题目说明

最好结合实际经历,编写一份C++程序,它可以控制随机数据的生成,还可以用这份数据进行测试,最后将它自己的测试文件连同两个输出文件按顺序整理到文件夹(子目录)“dataxxx”中,如“data1”,“data23”中。可以使用freopen(),system()等函数,它们都在库 < cstdlib >之中。

来源

当然,这题是我现场想的,就是生活中的一个实际应用。比如本人在OJ上做题时,有时会莫名其妙地被卡(就是明明对了却就是不让我过,哼),我对拍时闲得无聊想看它都测了啥,于是我就写出了一份控制程序。

下面贴上一份代码,因为我太弱了,所以比较时采用的是文件按位比较,且没比较长度。我对于输出“dataxxx”的解决方法是先写好dos命令的前半部分,然后在后面将数字拼接上(使用< cstring >库中的strcat()和strcpy()),细节可参考代码

代码

#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define maxn 505
using namespace std;
char cmp[maxn];int cnt=0;
char cmd[maxn];int con=0;
char s1[maxn]="md .\\data";//斜线要打成双斜线
char s2[maxn]="copy data.in .\\data";
char s3[maxn]="copy my.out .\\data";
char s4[maxn]="copy std.out .\\data";
char l1[maxn]="md .\\data";
char l2[maxn]="copy data.in .\\data";
char l3[maxn]="copy my.out .\\data";
char l4[maxn]="copy std.out .\\data";//字符串的大小要够,否则会导致字符串拼接不成功,而且三个文件需要分开copy,否则会被强大地合并为一个文件,有兴趣可以自己试一试
char c1[2];
void EXE(){
    strcpy(l1,s1);
    strcpy(l2,s2);
    strcpy(l3,s3);
    strcpy(l4,s4);//将原模板复制到l1,l2,l3,l4中以备后续使用
    int k[10];
    int m=con;
    int size=0;
    while(m>0){
        k[size++]=m%10;
        m=m/10;
    }
    for(int i=size-1;i>=0;i--){
        c1[0]=k[i]+'0';
        strcat(l1,c1);
        strcat(l2,c1);
        strcat(l3,c1);
        strcat(l4,c1);//字符串拼接
    }
    system(l1);
    system(l2);
    system(l3);
    system(l4);//执行上面的l1,l2,l3,l4命令,先创建目录,再把三份数据分别复制到指定地点
    return;
}
bool Judge(){
    cnt=0;
    fclose(stdout);
    int a=system("cd /d F:\\Someplace");//将当前路径引到当前代码的所在位置
    int b=system("Test.exe < data.in > std.out");
    int c=system("code2.exe < data.in > my.out");//这两句用于输入测试数据,取得输出文件
    freopen("std.out","r",stdin);
    while(scanf("%c",&cmp[cnt++])==1);
    freopen("my.out","r",stdin);
    int i=0;char ch;
    while(scanf("%c",&ch)==1){
        if(ch!=cmp[i++]){
            EXE();
            return false;
        }
    }
    EXE();
    return true;
}
int main(){
    freopen("data.in","w",stdout);
    srand(time(NULL));
    int A,B;
    do{
        freopen("data.in","w",stdout);//各种重定向
        do{
            A=rand()%2000000000+1;
            B=rand()%2000000000+1;
        }while(A>B);
        printf("%d %d",A,B);//这里就是生成测试数据的地方
        con++;
    }while(Judge()&&con<100);//这里即将执行对拍程序
    return 0;
}

这份代码兼职生成测试数据,其中Test.cpp为标程,code2.cpp为个人代码(不要问我名字为什么这么怪),同时字符串内的“\”要打成“\”才对。程序可以加以改动,直接运行即可(可能速度稍微慢一些,一分钟只能生成1000+个文件夹)

总结

当然本人也是非常的弱啦,肯定会有一堆dos大神或linux终端大神在默默地bs我。。。欢迎各位留言,评论,共同交流O(∩_∩)O~ 。哦,对了,下面贴上效果图(上面指定了con大小不超过100)

这里写图片描述

你看它们的修改日期都一样。。。

这里写图片描述

每个文件夹里面都是这三个文件,当然大小和内容都不相同:

这里写图片描述

我不禁想说:编程改变命运

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值