Archivo de lectura / escritura C ++ en Unix

Sé que esta es una pregunta muy específica. Estoy compilando un código c ++ usando el compilador g ++ en una máquina Unix. Tengo el siguiente código de una línea para leer un archivo de texto especificado como parámetro en C ++: test.cc

int main(int argc, char *argv[])
{

    ifstream inputfile(argv[1]);

}

Ahora, después de compilar con g ++, lo llamaré como:

./test file.txt

Pero, ¿qué debo hacer si quiero llamarlo como

./test <file.txt

En resumen, ¿cómo puedo leer un archivo usando la entrada / salida predeterminada?

preguntado el 08 de noviembre de 11 a las 18:11

quieres decir que quieres leer de stdin también, o en lugar de inputfile -

9 Respuestas

Deberías comprobar los argumentos para main para ver si hay un argumento dado al programa. Si es así, puede usarlo como archivo; de lo contrario, use std::cin.

Aquí hay un ejemplo:

void do_something(istream &input)
{
    // Read some stuff from the input
}

int main(int argc, char *argv[])
{
    if (argc == 1)
        do_something(cin);
    else if (argc == 2)
        do_something(ifstream(argv[1]));
    else
    {
        cout << "Error: Must supply a file\n";
        return 1;
    }
}

La razón por la que llamo a otra función para leer y procesar la entrada es porque no puede asignar flujos, pero debe usar referencias o punteros. También es bueno poner tareas separadas en funciones separadas, porque aumentará la legibilidad del código.

respondido 08 nov., 11:22

Joachim, solo una consulta, así que usando el código anterior, si ejecuto el programa compilado como ./test user1035927

@ user1035927 Sí, debería. Adelante, pruébalo. :) - Algún tipo programador

Cuando desee leer desde la entrada estándar, utilice std::cin en lugar de abrir tu propia transmisión.

Por ejemplo:

std::string s;
std::getline(std::cin, s);

respondido 08 nov., 11:22

El uso de <redirige ese archivo a stdin, por lo que lo accedería a través de std :: cin en c ++.

respondido 08 nov., 11:22

En su lugar, debe leer el archivo stdin, da.

en otras palabras, leer desde el teclado.

cuando ingrese cosas, se leerá como si estuviera escrito desde el teclado.

respondido 08 nov., 11:22

Puede hacer lo que hacen la mayoría de los comandos de Unix: leer del archivo si se especifica el nombre del archivo. Si falta el nombre del archivo, lea de la entrada estándar.

respondido 08 nov., 11:22

La cin el objeto ya está definido en iostream. Solo lee de cin en lugar de inputfile.

respondido 08 nov., 11:22

Quizás

ifstream &myin;
if (argc>1) {
   ifstream* inputfilep = new infstream(argv[1]);
   myin = *inputfile;
}
else myin = cin;
/* do your input on myin */

respondido 08 nov., 11:22

Las referencias deben inicializarse en la construcción. En su lugar, conviértalo en un puntero, o hágalo con el condicional ifstream &myin = (argc>1?*new infstream(argv[1]):cin); (¡no olvides eliminar myin si argc> 1!) - Pato morando

necesitará modificar su ejemplo para verificar argc para ver si se pasa algún argumento de línea de comando, ya que el shell elimina la redirección de entrada, por lo que si argc es 0, lea el estándar como se indica en los otros ejemplos, de lo contrario, como su código de ejemplo.

respondido 08 nov., 11:22

No tienes que hacer nada. Simplemente escriba su programa como si estuviera leyendo desde la línea de comandos.

respondido 08 nov., 11:22

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.