2009-09-29 15 views
6

Permítanme comenzar diciendo que esto está asociado con una tarea asignada. Sin embargo, esta es una parte muy pequeña y relativamente insignificante de la tarea.Lectura de los argumentos de la línea de comando después de '<' en C

El programa C recibe la entrada a través de argumentos de línea de comandos, pero tiene que ser en la forma:

$ ./program < input 

Cómo, tengo que hacer para recibir esa entrada como una cadena? Cada vez que intento imprimir el tercer argumento desde argv, recibo este mensaje:

entrada: No existe dicho archivo o directorio.

Respuesta

21

< es una redirección de shell que se maneja fuera de su programa. Lo que verá es que el contenido del nombre de archivo 'entrada' se envía a su flujo de entrada estándar. Esta es una forma común para que los programas funcionen, aunque generalmente también manejan que se les dé un nombre de archivo, p. sed.

Si tuviera que adivinar yo creo que la:

input: No such file or directory. 

proviene de la cáscara, ya que no puede abrir el archivo especificado: "entrada".

Por otro lado, si realmente desea < input como argumentos para su programa, puede escapar o citarlos para que el shell no los interprete. (Escapando a la izquierda como un ejercicio para el lector :-)).

+0

¡Guau, 6 votos en el primer minuto! –

+2

Esa es una gran oportunidad que tiene allí, Sr. Eastwood. –

3

Lo que viene después de < no es un argumento de línea de comandos. El contenido del archivo será canalizado a su programa por el shell.

Todo lo que necesita hacer es leer de stdin y obtendrá el contenido del archivo.

5

En sistemas * nix, no habrá ser un tercer elemento de argv. Si se ejecuta este comando en casi cualquier cáscara de Unix, que será similar a hacer esto:

cat input | ./program 

Así que su ./program tiene sólo un elemento en argv, pero es stdin es el archivo input, por lo que para leer el archivo que acaba de leer stdin. Tenga en cuenta que esta es una forma perfectamente válida para diseñar su programa. Muchos programas de Unix leen desde la entrada estándar si no se proporcionan archivos, de modo que puede canalizar la entrada desde otros programas (o en este caso, desde archivos).

+1

No solo en los sistemas * nix. DOS/Windows y OS/2 manejan esto de la misma manera. Y, por cierto, explicando '<' operador de shell con '|' realmente no aclara el problema ;-) –

+0

Puede que no lo haga inmediatamente más obvio, pero muestra más claramente que './program' no recibe ningún argumento. –

+0

Esto NO es cierto para DOS: en DOS, toda la línea de comando (con el redireccionamiento) se pasa al programa y es responsable de abrir el archivo y tal. Por supuesto, si usa un compilador de C, la rutina de inicio del compilador que se ejecuta antes de main hará esto por usted ... –

10

La sintaxis ./program < input es una sintaxis de shell especial que dice "redirige todo en el archivo denominado input a la entrada estándar del programa".

Para leer la entrada, su programa solo tiene que usar las funciones de lectura de entrada estándar, línea fgets o scanf.

+0

* "Para leer la entrada, su programa solo tiene que usar funciones de lectura de entrada estándar, línea' fgets' o 'scanf'." * Específicamente, en la corriente 'stdin'. –

+1

@ T.J. ¿En qué otra transmisión opera 'scanf()'? :PAG –

3

Necesita escapar del '<', de lo contrario el shell lo analizará y el programa no lo recibirá en la línea de comandos.

Si está utilizando bash, entonces:

./program '<' input 

o

./program \< input 

Otros proyectiles podrían hacerlo de otra manera (por ejemplo, Windows por defecto, cmd.exe, utiliza ^ como carácter de escape, no \)

-2

Lo puede leer leyendo stdin.

0

Esto es un shell de Unix. El formulario someprogram < somefile le dice a algún programa que se ejecute utilizando algún archivo como su entrada. Si desea hacer algo diferente que implique el símbolo <, deberá citarlo.

0

El < significa que el programa leerá su entrada estándar (stdin) del archivo nombrado (entrada). Así que solo lea de stdin (usando fgets, fread, etc.).

0

Deja el '<'. ¿Quieres argumentos de línea de comandos hacen esto:

$ ./program -Dflag siete = ixnay FromDinger

En su aplicación, intente esto:

int main(int argc, char **argv) 
{ 
    int i; 
    for(i = 0 ; i < argc ; ++i) 
     printf("Arg %d = %s\n", i, argv[i]); 
    return 0; 
} 

Se dará cuenta de que la primer argumento es el nombre del ejecutable (en el índice 0), y su segundo argumento (en el índice 1) será "-Dflag"

0

En realidad, esta es una técnica muy común utilizada en p torneos de rogramming. Los datos de su programa necesita se almacena en un archivo, digamos datos.txt, y luego de nuevo a su aplicación mediante el "<" en la cáscara, así: ./program < datos.txt

Por lo tanto, en el código fuente, lo que tiene que hacer es algo como esto:

#include <iostream> 
#include <string> 

using namespace std; 

int main(void) 
{ 
    string tmp; 
    string full_content; 

    while (cin >> tmp) 
     full_content += " "+tmp; 

    cout << full_content << endl; 
} 

.. y obtendrá todos los datos del archivo en una cadena (y separados por espacios).

Esa es una forma de hacerlo, espero que ayude. [] 's

Cuestiones relacionadas