Domanda

Vorrei iniziare dicendo questo è associato ad un compito a casa. Tuttavia, questo è un molto piccolo e relativamente insignificante parte del compito.

Il programma C riceve in ingresso attraverso la linea di comando ma deve essere nella 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:

  

ingresso:. Nessun file o directory

È stato utile?

Soluzione

<è un redirect shell - viene gestito al di fuori del programma. Quello che vedrete è il contenuto del nome del file di 'ingresso' in fase di inviare al vostro flusso di input standard. Questo è un modo comune per i programmi di operare, anche se di solito anche gestire essere dato un nome di file per esempio 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 vuole realmente la < input come argomenti al vostro programma, si può sfuggire o citarli in modo che la shell non li interpreterà. (Fuoriuscita lasciato come esercizio per il lettore: -)).

Altri suggerimenti

La sintassi ./program < input è una speciale sintassi della shell dire "reindirizza tutto nel file chiamato input alla voce standard del programma".

Per leggere l'input, il programma resta che utilizzare le funzioni di input di lettura standard, linea fgets o scanf.

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

cat input | ./program

Così il vostro ./program ha un solo elemento in argv, ma è stdin è il file input, in modo da leggere il file che si appena letto da stdin. Si noti che questo è un modo perfettamente valido per progettare il vostro programma. Molti programmi Unix letti dallo standard input, se non darà i file, in modo che si può pipe in ingresso da altri programmi (o in questo caso, da file).

Quello che viene dopo la < non è un argomento da riga di comando. Il contenuto del file verranno convogliati nel vostro programma dalla shell.

Tutto quello che dovete fare è leggere da stdin e si otterrà il contenuto del file.

È necessario sfuggire alla '<', altrimenti shell analizzarlo, e il programma non riceverà in-linea di comando.

Se stai usando bash, quindi:

./program '<' input

o

./program \< input

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

Questa è una shell Unix cosa. La forma someprogram < somefile dice someprogram da eseguire utilizzando somefile come input. Se si vuole fare qualcosa di diverso che coinvolge il simbolo <, avrete bisogno di citarlo.

Il < significa che il programma leggerà è standard input (stdin) dal file chiamato (input). Quindi, solo leggere da stdin (utilizzando fgets, fread, ecc).

Lascia fuori la '<'. Volete argomenti della riga di comando fanno questo:

  

$ ./program -Dflag sette = Ixnay FromDinger

Nella propria 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 primo argomento è il nome del file eseguibile (indice 0) e il secondo argomento (a indice 1) sarà "-Dflag"

In realtà, questa è una tecnica molto comune utilizzata nei tornei programmazione. 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: ./ programma

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 aiuta. [] 'S

È possibile ottenere con la lettura stdin.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top