2009-09-29 6 views
6

Lasciatemi dire che questo è associato a un compito a casa. Tuttavia, questa è una parte molto piccola e relativamente insignificante del compito.Lettura degli argomenti della riga di comando dopo '<' in C

Il programma C riceve l'input tramite argomenti della riga di comando, ma ha bisogno di essere in forma:

$ ./program < input 

Come, potrei fare per ricevere l'input come una stringa? Ogni volta che provo a stampare il terzo argomento da argv, ricevo questo messaggio:

input: Nessun file o directory.

risposta

21

< è un reindirizzamento della shell, gestito all'esterno del programma. Quello che vedrai è il contenuto del nome del file 'input' che viene inviato al tuo stream di input standard. Questo è un modo comune per far funzionare i programmi, sebbene in genere gestiscano anche il nome del file, ad es. sed.

Se dovessi indovinare penserei il:

input: No such file or directory. 

sta venendo dalla shell, in quanto è in grado di aprire il file specificato: "input".

D'altra parte, se si desidera effettivamente il < input come argomenti per il programma, è possibile scappare o citarli in modo che la shell non li interpreti. (Scappare a sinistra come esercizio per il lettore :-)).

+0

Wow, 6 voti nel primo minuto! –

+2

È un bel colpo che hai, signor Eastwood. –

3

Cosa succede dopo che lo < non è un argomento da riga di comando. Il contenuto del file verrà reindirizzato al tuo programma dalla shell.

Tutto ciò che devi fare è leggere da stdin e otterrai il contenuto del file.

5

Sui sistemi * nix, non ci sarà un terzo elemento di argv. Se si esegue il comando su quasi qualsiasi shell Unix-like, che sarà simile a fare questo:

cat input | ./program 

Così il vostro ./program ha un solo elemento in argv, ma è stdin è il file input, in modo di leggere il file che avresti appena letto da stdin. Nota che questo è un modo perfettamente valido per progettare il tuo programma. Molti programmi Unix leggono dall'input standard se non viene fornito alcun file, in modo che si possa reindirizzare l'input da altri programmi (o in questo caso dai file).

+1

Non solo su sistemi * nix. DOS/Windows e OS/2 gestiscono allo stesso modo. E a proposito, spiegando '<' operatore shell con '|' in realtà non chiarisce il problema ;-) –

+0

Potrebbe non renderlo immediatamente più ovvio, ma mostra più chiaramente che './program' non riceve alcun argomento. –

+0

Questo in realtà NON è vero per DOS - in DOS l'intera riga di comando (con il reindirizzamento) viene passata al programma ed è responsabile dell'apertura del file e così via. Naturalmente, se usi un compilatore C, la routine di avvio del compilatore che viene eseguita prima di main lo farà per te ... –

10

La sintassi ./program < input è una speciale sintassi della shell che dice "Reindirizza tutto nel file denominato input alla voce standard del programma".

Per leggere l'input, il programma deve solo utilizzare le funzioni di lettura degli ingressi standard, riga fgets o scanf.

+0

* "Per leggere l'input, il tuo programma deve solo usare le funzioni standard di lettura degli input, linea' fgets' o 'scanf'." * Specificamente, sul flusso 'stdin'. –

+1

@ T.J. Su quale altro flusso funziona 'scanf()'? : P –

3

È necessario sfuggire allo '<', altrimenti la shell lo analizzerà e il programma non lo riceverà in riga di comando.

Se stai usando bash, quindi:

./program '<' input 

o

./program \< input 

Altri gusci potrebbero farlo in modo diverso (ad esempio Windows di default, cmd.exe, utilizza ^ come carattere di escape, non \).

-2

Puoi farlo leggendo stdin.

0

Questa è una cosa di shell Unix. Il modulo someprogram < somefile dice a qualche programma di funzionare usando un file come suo input. Se vuoi fare qualcosa di diverso che coinvolge il simbolo <, dovrai citarlo.

0

Il < significa che il programma leggerà il suo input standard (stdin) dal file specificato (input). Quindi basta leggere da stdin (usando fgets, fread, ecc.).

0

Lasciare il '<'. Volete argomenti della riga di comando fanno questo:

$ ./program -Dflag sette = Ixnay FromDinger

Nell'applicazione, provate questo:

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

si noterà che il il primo argomento è il nome dell'eseguibile (nell'indice 0) e il secondo argomento (nell'indice 1) sarà "-Dflag"

0

In realtà, questa è una tecnica molto comune utilizzata in p tornei di riorganizzazione. I dati del programma ha bisogno è memorizzato in un file, diciamo data.txt, e quindi reindirizzati alla vostra applicazione utilizzando il "<" sul guscio, in questo modo: ./program < data.txt

Quindi, nel codice sorgente, cosa che devi fare è qualcosa di simile:

#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; 
} 

.. e avrai tutti i dati dal file su una stringa (e separati da spazi).

Questo è un modo per farlo, spero che sia d'aiuto. [] 's

Problemi correlati