我有一个C ++程序,它输出提示并通过标准输入流cin。
获取用户输入我想获得一份完整的成绩单,包括程序的输出和文件中的输入。
我知道我可以使用命令行重定向重定向输入/输出(即./program< in.txt> out.txt),但这只会用程序的输出填充out.txt以响应输入来自in.txt。
我希望有一个显示输入和输出的记录。也就是说,假设我的程序输出一个提示“\ n输入一个数字:”,取一个用户输入的数字并输出它的两倍,“\ nTwice你的数字是:”,并一直这样做直到用户输入0。
假设我的in.txt包含:
1
3
0
然后我想要输入/输出的成绩单:
输入数字:1
你的号码是两倍:2
输入一个数字:3
你的号码是两倍:6
输入一个数字:0
你的号码是两倍:0
很抱歉,如果我没有很好地解释这个......我真的不知道如何说出来。
有没有办法简单地做到这一点,或者我只需要手动输入输入......并做一些终端保存......
答案 0 :(得分:3)
script
不包括您的确切用例。您希望完全按用户看到的那样看到您的程序的输入和输出,但无需自己完成。
我找到Expect,这似乎正是我们正在寻找的。我不知道Tcl,但是有一个Python端口pexpect
。你需要安装pexpect:
wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz
tar xzf pexpect-2.3.tar.gz
cd pexpect-2.3
sudo python ./setup.py install
然后将此代码复制到可执行文件中:
#! /usr/bin/env python
import sys, pexpect
executable = sys.argv[1]
infile = sys.argv[2]
proc = pexpect.spawn(executable)
file = open(infile)
for line in file:
proc.send(line)
proc.sendeof()
proc.expect(pexpect.EOF)
print proc.before,
然后你可以像这样运行它:
transcript ./executablefile fileforinput
我的示例运行给了我这个输出:
Enter a number: 1
Twice your number is: 2
Enter a number: 2
Twice your number is: 4
Enter a number: 3
Twice your number is: 6
Enter a number: 0
Twice your number is: 0
假设我正确地阅读了您的问题,那应该是您正在寻找的确切答案。它适用于任何程序而无需任何修改。
希望有所帮助!
-Jake
答案 1 :(得分:2)
UNIX script
命令将执行此操作。
答案 2 :(得分:0)
有趣的问题。应该是跨平台的东西就像下面的例子(我已经在Windows和* nix上测试过,但不幸的是没有测试的mac)。基本上,您将读取初始文件并提取其数据(在示例的情况下,它假定文件的格式与您上面提到的完全相同)并将数据存储在某处。然后,将数据写回您从中读取的文件。
/**
* File Input/Output
*
* Input file is also output file
*
* 12/13/10
*/
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int main()
{
// Get data and store it
ifstream in("output.txt");
// Simple error checking
if(!in.is_open())
{
cout<< "There was an error opening output.txt!" << endl;
return 0;
}
cout<< "Reading file..." << endl << endl;
// Strings are quicker to implement
string tmp;
string data;
int tmpi = 0;
// Here is where we store the input - the stringstream allows us to handle
// multiple variable types and convert them. NOTE: there is no error checking here,
// so wrong types _WILL_ throw errors (format needs to be one number per line)
stringstream ss(stringstream::in|stringstream::out);
while(getline(in,tmp))
{
tmpi = 0; // Reset
ss.str(string());
ss << tmp;
ss >> tmpi;
tmpi *= 2;
// Reset it again so we can get the doubled value
ss.clear();
ss.str(string());
ss << tmpi;
data.append("Enter a number: "+tmp+"\r\n"+"Twice your number is: "+ss.str()+"\r\n");
}
in.close();
// Output handling
ofstream out("output.txt",ios::binary|ios::trunc); // Delete everything which was in the file?
// Simple error checking
if(!out.is_open())
{
cout<< "There was an error opening output.txt!" << endl;
return 0;
}
cout<< "Generating output..." << endl << endl;
// Write to the file
out.write(data.c_str(),data.size());
out.close();
cout<< "Done!"<< endl;
cin.get(); // Pause momentarily
return 0;
}
我的原始输入文件是:
12
2312349
324843
3249
0909
输出结果为:
Enter a number: 12
Twice your number is: 24
Enter a number: 2312349
Twice your number is: 4624698
Enter a number: 324843
Twice your number is: 649686
Enter a number: 3249
Twice your number is: 6498
Enter a number: 0909
Twice your number is: 1818
希望这有帮助!