相当の〜getopt()
は、正確にはgetopt()
です。 getopt()
関数は、特にコマンドライン引数を処理しません。コマンドライン引数のスタイルの文字列へのポインタ配列を処理します。
#define MAX_ARGS 256
#define MAX_FILE_LEN 4096
int main(int argc, char *argv[])
{
if(argc > 1)
{
FILE *f = fopen(argv[1], "r");
if(f != 0)
{
char fargs[MAX_FILE_LEN] = "" ;
fread(fargs, 1, MAX_FILE_LEN, f) ;
// Build fargv from file content
char* fargv[MAX_ARGS] ;
int fargc = 0 ;
fargv[fargc] = strtok(fargs, " \n\r") ;
while(fargc < MAX_ARGS && fargv[fargc] != 0)
{
fargc++ ;
fargv[fargc] = strtok(0, "\n\r") ;
}
// Process fargv using getopt()
while((char c = getopt(fargc, fargv, "a:b:c:")) != -1)
{
switch(c)
{
...
}
}
}
}
...
return 0 ;
}
動的にtehの実際のファイルの長さを使用してfargs
を割り当てることはおそらく良いですが、上記は一例です。
あなたの入力ファイルは、次のようになります。
-a 100
-b 5,2,5
-c 0.0014
getopt()
ループは、必要に応じて引数を処理する必要があります - 例えばsscanf()
を使用。
switch(c)
{
case 'a' : sscanf(optarg, "%i", a) ; break ;
case 'b' : sscanf(optarg, "%i,%i,%i", b[0], b[1], b[2]) ; break ;
case 'c' : sscanf(optarg, "%f", c) ; break ;
}
DoStuff(a, b, c) ;
fopen(argv [1]、 "r") 'と' Source(argv [1]) 'は簡単です。 'if(argc> 1){FILE * f = fopen(argv [1]、" r ")でなければなりません。 ... ' – chux
コマンドラインから引数を得るための 'モダンな'方法は、 'getopt'または' getopt_long'を使うことです。詳細については、この記事を参照してください:http://stackoverflow.com/questions/1973742/how-to-get-a-value-from-optarg – bruceg
@brucegありがとう!コマンドライン引数を解析するのではなく、ファイルから引数を取り出すのに便利な 'getopt'と同等のものがありますか? –