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