2010-12-13 5 views
1

Ich muss ein Programm schreiben, das mit Eingabe aus einer Datei oder der Shell (für die Pipeline-Verarbeitung) funktioniert. Was ist der effizienteste Weg, damit umzugehen? Ich muss im Wesentlichen die Eingabe Zeile für Zeile lesen, aber die Eingabe könnte die Ausgabe eines anderen Programms aus der Shell oder einer Datei sein.Pipeline-Eingangsdaten

Danke

Antwort

0

Ich denke, es ist eine Named Pipe, mit der Sie arbeiten möchten. Aber von dem, was ich weiß, muss das andere Programm seine Ausgabe in die Named Pipe schreiben (Wenn Sie Zugang zu diesem Programm haben, können Sie das tun) und Ihr Programm wird von der Named Pipe lesen.

Hoffe das hilft Ihnen.

0

Ich könnte die Frage falsch interpretieren, aber ich denke, Sie möchten, dass Ihr Programm so verwendet werden kann: cat [some_file] | [your_program] oder [your program] < [some_file].
Wenn dies der Fall ist, müssen Sie nur von der Standardeingabe (stdin/cin) lesen, die Shell kümmert sich um den Rest.

Wenn Sie Ihr Programm entweder lesen von stdin oder aus einer Datei können Sie tun, was eine Reihe von Befehlszeile utils tun, das heißt cat:

Katze [OPTION] [DATEI] ...
...
Ohne Datei, oder wenn FILE ist -, lesen Sie Standard-Eingang.

Für ein Codebeispiel, das die oben genannten implementiert, siehe this Artikel.

+0

ja, ich denke, was du gesagt hast ist was ich suche. Was du sagst ist, dass ich etwas wie getline (std :: cin, mystring) verwenden soll? – Bob

+0

wäre es möglich zu erweitern, was Sie gesagt haben, direkt in die Shell verwendet werden?Zum Beispiel, wenn ich wollte, dass das Programm Zeile für Zeile von der Shell liest ... – Bob

+0

Im obigen Beispiel macht die Shell unsere Leben einfacher, indem wir Pipes erstellen und dann die Bytes zwischen den Programmen übertragen. Wenn Sie in Ihrem Code tun wollen, dann müssen Sie entweder eine Named Pipe wie ich erwähnt verwenden oder mit der "System()" -Funktion prüfen, Shell-Befehle auszuführen. – Arunmu

1

Ich kann den Kommentarlink nicht finden, also posten Sie eine Antwort. Wie Eugen Constantin Dinca sagte, Pipe oder Redirect nur an den Standard-Eingang ausgegeben, was Ihr Programm tun muss, wird von der Standard-Eingabe gelesen.

Ich weiß nicht, was "Zeile für Zeile" bedeutet, wie Sie erwähnt haben, etwas wie ftp interaktiver Modus? Wenn dies der Fall ist, sollte es in Ihrem Programm eine Schleife geben, die einmal eine Zeile liest und auf die nächste Eingabe wartet, bis Sie das Terminal-Signal geben.


Edit:

int c; 
while(-1 != (c = getchar())) 
    putchar(c); 
+0

by zeilenweise lesen Ich meine sowas wie while (! EOF) oder ein entsprechendes Zeichen für shell. Während das abschließende Zeichen nicht gefunden wird, lese ich eine Zeile (z. B. durch \ n getrennt) und bearbeite es – Bob

+0

Ja, EOF zeigt das Ende der Standardeingabe an, wenn Sie von der Datei umleiten oder die Pipe verwenden. – user435657

1

Hier ist ein C Beispiel aus Echo All Palindromes, in C:

int main(int argc, char* argv[]) { 
    int exit_code = NO_MATCH; 
    if (argc == 1) // no input file; read stdin 
    exit_code = palindromes(stdin); 
    else { 
    // process each input file 
    FILE *fp = NULL; 
    int ret = 0; 
    int i; 
    for (i = 1; i < argc; i++) { 
     if (strcmp(argv[i], "-") == 0) 
     ret = palindromes(stdin); 
     else if ((fp = fopen(argv[i], "r")) != NULL) { 
     ret = palindromes(fp); 
     fclose(fp); 
     } else { 
     fprintf(stderr, "%s: %s: could not open: %s\n", 
       argv[0], argv[i], strerror(errno)); 
     exit_code = ERROR; 
     } 
     if (ret == ERROR) { 
     fprintf(stderr, "%s: %s: error: %s\n", 
       argv[0], argv[i], strerror(errno)); 
     exit_code = ERROR; 
     } else if (ret == MATCH && exit_code != ERROR) 
     // return MATCH if at least one line is a MATCH, propogate error 
     exit_code = MATCH; 
    } 
    } 
    return exit_code; 
} 

Um es zu C anzupassen ++: Schreibfunktion (es ist palindromes oben), der akzeptiert std::istream&; übergeben Sie es entweder std::cin (für Standardeingabe oder '-' Dateiname) oder ifstream Objekte von der main() Funktion.

Verwenden Sie std::getline() mit einem gegebenen std::istream Objekt innerhalb der Funktion, Zeile für Zeile Zeile lesen (die Funktion kümmert sich nicht, ob die Eingabe aus einer Datei oder Stdin ist).