2016-10-22 1 views
2

Ich bin ein wenig Neuling in C.char * argv Haupt [] enthält keine Argumente, wenn stdin Datei ist

./main 7 4 

Dieser Befehl im Terminal führt dazu, dass argv [1] = 7, argv [2 ] = 4.

./main <input.in 

Als ich Umleiten von stdin im Terminal verwenden, zeigt es nur argc = 1 (./ Main).

Gibt es eine Möglichkeit, dieses Problem zu lösen, oder muss ich einen anderen Weg versuchen?

+2

'stdin' ist nicht dasselbe wie die * Befehlszeilenargumente *, die an ein Programm übergeben werden. – EOF

+1

"* Gibt es eine Möglichkeit, dieses Problem zu lösen *" Welches Problem? Sie haben ein gut definiertes Verhalten beschrieben, aber uns nicht gesagt, was das Problem ist. – alk

+0

Für das zweite Beispiel verwenden Sie eine beliebige Art von * reading * von 'stdin' (Standard Input), um Ihre Zahlen zu erhalten. – alk

Antwort

2

Sie shell interpretiert die <file.txt als "send file.txt Inhalt zu diesem Prozess 'stdin", so dass Ihr Programm nie den <file.txt Teil sehen wird.

Es gibt keine Möglichkeit, dies zu beheben, da dies eine absichtliche Funktion von POSIX (und möglicherweise anderen) Shells ist.

0

Wir seit Sie auf Ubuntu sind und ein Terminal verwenden, nehme ich an, dass Sie Bash verwenden. Das Problem, das Sie erleben, ist kein echtes Problem, sondern wie bash Ihr Programm startet.

Das Terminal hakt in der Prase ./program [args, ...] < redirected, bash Aufruf intern die exec Funktion, um Ihr Programm zu starten und wird die Umgebung für Ihr Programm einrichten. Es richtet Ihr Programm mit einem der Argumente zwischen [], aber nach und einschließlich der Umleitungssymbole "<" ein. Es wird Ihrem Programm nicht als Argument präsentiert, aber es verbindet es mit der Standardeingabe.

Also, wenn Sie möchten, dass mit ihm etwas tun, können Sie tun:

#include <stdio.h> 
int mychar = getchar(stdin). 

weil die FILE* stdin; ist schon dafür geöffnet. Die stdin-Datei akzeptiert ansonsten Eingaben von der Tastatur, liest aber nun aus der Datei. Sie sind natürlich nicht beschränkt auf getchar Sie können viele c-Funktion von stdio.h nehmen, die eine Datei * nehmen und verwenden.

Verwandte Themen