2016-09-25 5 views
0

Ich versuche, den Namen der Eingabedatei in meinem C-Programm nicht fest zu codieren. Ich habe alle anderen Komponenten, wenn ich den Dateinamen fest codiere. Aber möchte in der Lage sein, einen String-Dateinamen zu übergeben. Ich versuche, eine Datei namens Matrix.c kompilieren und nennen Sie die ausführbare Datei matrix.So übergeben Sie einen Dateinamen beim Ausführen eines C-Programms

Also, im Terminal, wenn ich zu meinem Arbeitsverzeichnis komme.

gcc -g Matrix.c -o matrix 

dann, wenn ich kompilieren

./matrix 

Es macht keinen Dateinamen an sie übergeben haben, so bin ich Gonna Check für das und haben den Eingangs Benutzer einen Dateinamen zu laden.

Wenn jedoch jemand den Dateinamen übergibt, sollte es übergeben werden:

./matrix filename.txt 

oder

./matrix < filename.txt 

Bei letzterer Option kann ich nicht den Namen des Arguments scheinen, von argv[1] an die Funktion übergeben - es ist nur "(Null)".

Ich weiß, das ist sehr einfach Frage. Bin ich aber gerade komplett von meinem Rocker abgekommen? Hat es etwas damit zu tun, dass ich auf OS X El Capitan laufe? Ich weiß, dass ich die Konvention '<' vorher benutzt habe.

+0

Ich habe mich umgeschaut und es gibt einige verschiedene Lösungen und verschiedene Möglichkeiten, damit umzugehen. – WallofKron

+0

können Sie uns den Code von 'matrix.c' zeigen? Das Umleiten mit '<' erfordert kein zusätzliches Argument, sondern das Lesen von 'stdin' mit' scanf', 'gets', egal wie Sie an der Standardeingabe gearbeitet haben. –

+0

Wenn Sie

Antwort

0

Argumente für einen Befehl sind in argv [1 .. argc-1].

Die Umleitung von '<' sendet den Inhalt der Datei an die Standardeingabe des Programms.

Eine dritte Möglichkeit, den Dateinamen zu erhalten, wäre, "Dateiname eingeben:" zu drucken und dann die vom Benutzer eingegebene Zeichenfolge zu lesen.

+0

Vielen Dank für das Aufräumen. Ich habe es gerade repariert und versucht, alle drei Arten der Eingabe zu adressieren. Danke – WallofKron

4

Das Problem ist, wie die Shell hauptsächlich funktioniert. Wenn Sie:

./matrix filename.txt 

dann wird das Programm zwei Argumente gegeben - die Programmnamen und die Dateinamen. Wenn Sie:

./matrix < filename.txt 

dann wird das Programm nur ein Argument gegeben - den Programmnamen - und die Schale arrangiert für seine Standard-Eingabe aus der Datei kommen (und der Dateiname wird nicht an Ihr Programm übergeben wird).

Entweder kann gemacht werden, um zu arbeiten; Sie müssen nur entscheiden, welche Sie unterstützen möchten. Was passiert, wenn der Benutzer ./matrix file1.txt file2.txt file3.txt eintippt? Eine Version des herkömmlichen Verhaltens besteht darin, jede Datei der Reihe nach zu verarbeiten und jeden Satz von Ergebnissen in die Standardausgabe zu schreiben. Es gibt viele alternative Verhaltensweisen - die meisten von ihnen wurden irgendwann von jemandem benutzt. Das Lesen von der Standardeingabe, wenn kein Dateiname angegeben ist, ist ein üblicher Betriebsmodus (denke cat und grep und ...).

+0

Danke für das Aufräumen. Ich habe es gerade repariert und versucht, alle drei Arten der Eingabe zu adressieren. Danke – WallofKron

+0

Ich benutze häufig Funktionen ähnlich wie 'Int-Prozessor (FILE * fp, const char * fn)', die liest die Eingabe aus dem Stream 'fp', die die geöffnete Datei' fn' ist (oder ein Pseudo-Name für 'Standard-Eingabe '), manchmal mit einem zusätzlichen Argument 'FILE * ofp' um anzugeben, in welche Datei die Ausgabe geschrieben werden soll. Der Rückgabewert ist 0 für 'Erfolg' und alles andere für einen Fehler. Der Code in Ihrem Hauptprogramm kann dann 'processor()' ziemlich einfach aufrufen. In der Tat habe ich eine Reihe von Funktionen, die die Verarbeitung für null oder mehr Residualargumente behandeln, also 'main()' endet 'return filter (argc, argv, optind, processor);'. –

+0

'isatty()' kann hier nützlich sein, siehe http://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-in-pipe-in-c-c-qt – cdarke

Verwandte Themen