将string转为stdin输入

通过lex生成的scanner需要通过stdin,或者文件读取来扫描文件,而z3能用to_smt2()输出string

我们希望将z3生成的string转成stdin,供我们自己的编译器使用

1.最简单的方法是使用freopen,打开一个文件,将string输入该文件中,然后再用freopen,将文件的内容作为stdin读出,该方法存在问题主要是效率较低,文件读写需要磁盘操作,会降低速度.

string s1="(declare-fun t2 () Int)\n(declare-fun t1 () Int)\n(assert (>= (- t1 t2) 1))\n(check-sat)\n";
    ofstream outfile;
    outfile.open("./a.smt2", ios::out);
    outfile<<s1;
    outfile.close();
    freopen("./a.smt2","r",stdin);

2.一种可行的方案是将其读入一个管道中,然后再从管道中定向到stdin中,具体操作如下。

    string s ="(declare-fun t2 () Int)\n(declare-fun t1 () Int)\n(assert (>= (- t1 t2) 1))";
    int fd[2];
    pipe(fd);//打开一个管道
    write(fd[1], s.data(), s.size());//向管道中写入string
    close(fd[1]);//关闭写管道
    dup2(fd[0], STDIN_FILENO);//将管道中内容重定向到stdin中
    close(fd[0]);//关闭管道

3.如果输入不是stdin,而只是cin的话,可以用字符串流的操作

string s= "string\n";
stringstream buf;// 字符串流buf
buf<<s;//将字符串s给到buf
std::cin.rdbuf(buf.seekg(0).rdbuf());//buf.seek将字符串流转成输入流,cin.rdbuf将buf的输入流重定向到cin的输入流

但是需要注意的是,cin和stdin的对应的cout部分虽然相同,但是他们的缓冲区并不共享,因此如果需要的是stdin,该方法不能成功

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值