gpt4 book ai didi

c - 从 C 文件解析参数的最简单方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 05:35:24 28 4
gpt4 key购买 nike

考虑一个文件 ArgumentFile.txt

int a=100;
int b[3] = { 5, 2, 5 };
double c = 0.0014;

以及主要代码code.c

int main(int argc, char *argv[])
{
if (argc > 1) FILE *f = fopen(argv[1], "r");
ParseFile(f); // Set the parameters based on file
DoStuff(a,b,c); // Run the process based on the parsed arguments
}

然后用户可以通过以下方式传递参数

./CodeExecutable ArgumentFile.txt

是否有一个标准的解决方案来解析文件中的参数?它相当于 getopt 从命令行解析参数?

最佳答案

您不需要等同于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 ;
}

使用实际文件长度动态分配 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 ) ;

关于c - 从 C 文件解析参数的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39840926/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com