有没有办法将输入和输出重定向到同一个文件?

时间:2010-12-13 10:09:40

标签: c++ redirect input console

我有一个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

很抱歉,如果我没有很好地解释这个......我真的不知道如何说出来。

有没有办法简单地做到这一点,或者我只需要手动输入输入......并做一些终端保存......

3 个答案:

答案 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

希望这有帮助!

祝你好运!
丹尼斯M。