tuberias sólo son salidas salida redirigir qué que primeras opción mostrará líneas los las filtros filtro fichero enviar comandos comando cinco canal archivo c++ redirect input console

c++ - sólo - tuberias y filtros en linux



¿Hay alguna manera de redirigir la entrada y la salida al mismo archivo? (3)

El comando de script UNIX lo hará.

Tengo un programa en C ++ que emite avisos y toma la entrada del usuario a través del flujo de entrada estándar cin.

Quiero 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 genera su doble, "/ nTwo su número es:", y sigue haciendo esto hasta que el usuario ingrese un 0.

Digamos que tengo en .txt que contiene:

1
3
0

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

Ingrese un número: 1
El doble de tu número es: 2
Ingrese un número: 3
El doble de tu número es: 6
Ingrese un número: 0
El doble de tu número es: 0

Perdón si no explicara esto muy bien ... Realmente no sabía cómo decirlo.

¿Hay alguna manera de hacer esto simplemente, o simplemente tengo que ingresar la entrada a mano ... y hacer un poco de ahorro de la terminal ...


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 fue:

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.


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é Esperar , que parece ser exactamente lo que estamos buscando. No sé Tcl, pero hay un puerto de Python, pexpect . Necesitarás 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 copie 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 puedes ejecutarlo así:

transcript ./executablefile fileforinput

Mi ejecución de 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

Asumiendo que 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