C에서 '<'후에 명령 줄 인수를 읽는다
-
18-09-2019 - |
문제
이것이 숙제 과제와 관련이 있다고 말하면서 시작하겠습니다. 그러나 이것은 과제의 매우 작고 비교적 중요하지 않은 부분입니다.
C 프로그램은 명령 줄 인수를 통해 입력을 수신하지만 양식에 있어야합니다.
$ ./program < input
어떻게 그 입력을 문자열로 받는가? Argv에서 세 번째 인수를 인쇄하려고 할 때 마다이 메시지를받습니다.
입력 : 그러한 파일이나 디렉토리가 없습니다.
해결책
<쉘 리디렉션입니다. 프로그램 밖에서 처리됩니다. 당신이 보게 될 것은 파일 이름 '입력'의 내용이 표준 입력 스트림으로 보내는 것입니다. 이것은 프로그램이 운영되는 일반적인 방법이지만, 일반적으로 파일 이름이 주어 지지만 예를 들어 sed
.
내가 추측해야한다면 나는 다음을 생각할 것이라고 생각한다.
input: No such file or directory.
"입력"을 지정된 파일을 열 수 없으므로 쉘에서 나옵니다.
반면에, 당신이 실제로 원한다면 < input
프로그램에 대한 인수로서, 당신은 쉘이 그것들을 해석하지 않도록 그것을 피하거나 인용 할 수 있습니다. (독자를위한 운동으로 떠난다 :-)).
다른 팁
그만큼 ./program < input
구문은 "이름이 지정된 파일의 모든 것을 리디렉션하는 특수 쉘 구문입니다. input
프로그램의 표준 입력에 ".
입력을 읽으려면 프로그램이 표준 입력 읽기 기능, 라인을 사용하면됩니다. fgets
또는 scanf
.
*닉스 시스템에는 그렇지 않습니다 ~이다 세 번째 요소 argv
. 거의 모든 UNIX와 같은 쉘에서 해당 명령을 실행하면 다음과 비슷합니다.
cat input | ./program
그래서 당신의 ./program
하나의 요소 만 있습니다 argv
, 그러나 그것은입니다 stdin
파일입니다 input
, 파일을 읽으려면 stdin
. 이것은 프로그램을 설계하는 완벽하게 유효한 방법입니다. 많은 UNIX 프로그램은 파일이 제공되지 않으면 표준 입력에서 읽으므로 다른 프로그램 (또는이 경우 파일)에서 입력 할 수 있습니다.
이후에 오는 것 <
명령 라인 주장이 아닙니다. 파일의 내용은 쉘에 의해 프로그램에 배치됩니다.
stdin에서 읽기 만하면 파일의 내용을 얻을 수 있습니다.
'<'를 피해야합니다. 그렇지 않으면 쉘이 구문 분석되며 프로그램은 명령 줄로 수신하지 않습니다.
Bash를 사용하는 경우 :
./program '<' input
또는
./program \< input
다른 쉘은 다르게 수행 할 수 있습니다 (예 : Windows의 기본값, cmd.exe
, 용도 ^
탈출 캐릭터로서 \
).
이것은 유닉스 쉘입니다. 양식 someprogram < somefile
약간의 프로그램에 약간의 실행을 입력으로 사용하도록 지시합니다. 당신이 다른 일을하고 싶다면 <
기호, 당신은 그것을 인용해야합니다.
그만큼 <
프로그램이 이름이 지정된 파일 (입력)에서 표준 입력 (stdin)을 읽습니다. 따라서 Stdin에서 읽으십시오 (사용 fgets
, fread
, 등).
'<'를 떠나십시오. 명령 줄 인수를 원합니다.
$ ./program -dflag 7 = ixnay fromdinger
응용 프로그램에서 다음을 시도하십시오.
int main( int argc, char **argv )
{
int i;
for( i = 0 ; i < argc ; ++i )
printf( "Arg %d = %s\n", i, argv[i] );
return 0;
}
첫 번째 인수는 실행 파일 (색인 0)의 이름이며, 두 번째 인수 (색인 1)는 "-dflag"입니다.
실제로 이것은 프로그래밍 토너먼트에 사용되는 매우 일반적인 기술입니다. 귀하의 프로그램이 필요한 데이터는 파일에 저장되고 Data.txt라고 말한 다음 쉘의 "<"를 사용하여 응용 프로그램으로 리디렉션합니다. ./program <data.txt
따라서 소스 코드에서해야 할 일은 다음과 같습니다.
#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;
}
.. 그리고 문자열의 파일에서 모든 데이터를 얻을 수 있습니다 (그리고 공간별로 분리).
그것이 한 가지 방법입니다. 도움이되기를 바랍니다. []'에스
Stdin을 읽어서 얻을 수 있습니다.