2010-12-13 26 views
8

Tengo un programa C++ que envía mensajes y toma la entrada del usuario a través del flujo de entrada estándar cin.¿hay alguna manera de redirigir la entrada y la salida al mismo archivo?

Deseo obtener una transcripción completa que incluya tanto la salida del programa como la entrada en un archivo.

Sé que puedo redirigir la entrada/salida con la redirección de línea de comandos (es decir ./program < in.txt> out.txt), pero esto solo completará.txt con la salida del programa en respuesta a la entrada de in.txt.

Quiero tener una transcripción que muestre tanto la entrada como la salida. Es decir, digamos que mi programa emite un mensaje "\ nIngrese un número:", toma un número ingresado por el usuario y muestra su doble, "\ nTwo su número es:", y continúa haciendo esto hasta que el usuario ingrese 0.

Digamos que he in.txt que contiene:

Entonces yo quiero tener una transcripción de entrada/salida:

Introduzca un número: 1
Dos veces su número es: 2
Introduzca un número: 3
Dos veces su número es: 6
Introduzca un número: 0
Dos veces su número es: 0

Disculpa si no explicaba esto muy bien ... Realmente no sabía cómo decirlo.

¿Hay una manera de hacer esto, simplemente, o tengo sólo hay que entrar en la entrada con la mano ... y hacer algo de salvamento de la terminal de ...

+0

¿Qué sistema operativo está utilizando? – Beta

+0

Mac, Linux, ambos. Estaría contento con una solución para cualquier sistema operativo – zebraman

+0

¿Por qué no solo emite todo lo que ingresa, inmediatamente después de ingresarlo? –

Respuesta

2

El comando UNIX script lo hará.

+0

hmm, el script solo está grabando la salida de mi programa, no la entrada + salida. ¿Hay alguna forma de usar script Y redirigir la entrada desde un archivo? – zebraman

+0

'cat foo; prog SingleNegationElimination

+2

Esto no está haciendo lo que está pidiendo – cstack

0

Interesante pregunta. Algo que debería ser multiplataforma es como el siguiente ejemplo (he probado en Windows y * nix pero no tengo un Mac para probar desafortunadamente). Básicamente, leerá el archivo inicial y extraerá sus datos (en el caso del ejemplo, supone que el archivo está formateado exactamente como lo ha mencionado anteriormente) y almacenará esos datos en algún lugar. Luego, vuelva a escribir los datos en el archivo desde el que lo leyó.

/** 
* 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; 
} 

Mi archivo de entrada original:

12 
2312349 
324843 
3249 
0909 

La salida fue:

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 

Espero que esto ayude!

¡Buena suerte!
Dennis M.

3

script no cubre su caso de uso exacto.Le gustaría ver la entrada y salida de su programa exactamente como lo vería un usuario, pero sin tener que hacerlo usted mismo.

Encontré Expect, que parece ser exactamente lo que estamos buscando. No sé Tcl, pero hay un puerto de Python, pexpect. Tendrá que instalar 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 

luego copiar este código en un archivo ejecutable:

#! /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, 

Y luego se puede ejecutar de este modo:

transcript ./executablefile fileforinput 

Mi análisis de la muestra me dio esta salida:

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 

Assu Si leí bien tu pregunta, esa debería ser la respuesta exacta que estás buscando. Y funciona en cualquier programa sin ninguna modificación.

Espero que ayude!

-Jake

Cuestiones relacionadas