Есть ли способ перенаправить ввод и вывод в один файл? - PullRequest
8 голосов
/ 13 декабря 2010

У меня есть программа на C ++, которая выводит подсказки и принимает ввод пользователя через стандартный поток ввода cin.

Я хочу получить полную расшифровку, включающую как вывод программы, так и ввод в файл.

Я знаю, что могу перенаправить ввод / вывод с помощью перенаправления командной строки (т.е. ./program out.txt), но это будет заполнять только файл.txt выходными данными программы в ответ на входные данные из in .текст.

Я хочу иметь расшифровку, которая показывает как ввод, так и вывод. То есть, скажем, моя программа выводит подсказку «\ nВведите число:», берет введенный пользователем номер и выводит его двойное число «\ nТвое время ваш номер:», и продолжает делать это, пока пользователь не введет 0.

Допустим, у меня есть in.txt, содержащий:

1
3
0

Тогда я хочу получить расшифровку ввода / вывода:

Введите число: 1
Дважды ваш номер: 2
Введите число: 3
Дважды ваш номер: 6
Введите число: 0
Дважды ваш номер: 0

Извините, если я не очень хорошо объяснил это ... Я действительно не знал, как это сказать.

Есть ли способ сделать это просто, или мне просто нужно ввести ввод вручную ... и сделать некоторое сохранение терминала ...

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

script не охватывает ваш конкретный случай использования.Вы хотели бы видеть ввод и вывод вашей программы в точности так, как ее видит пользователь, но без необходимости делать это самостоятельно.

Я обнаружил Ожидайте , что, по-видимому, точночто мы ищемЯ не знаю 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

Если я правильно прочитал ваш вопрос, это должен быть точный ответ, который вы ищете.И он работает на любой программе без каких-либо изменений.

Надеюсь, это поможет!

-Джэйк

2 голосов
/ 13 декабря 2010

Команда UNIX script сделает это.

0 голосов
/ 14 декабря 2010

Интересный вопрос.То, что должно быть кроссплатформенным, похоже на приведенный ниже пример (я тестировал на 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

Надеюсь, это поможет!

Удачи!Деннис М.

...