通过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,该方法不能成功