目前正在尝试解析C中的输入文件以提取变量。
输入文件如下:
% this is a comment
x 3
% another comment
y 5.0
% one last comment
z 4
x,y和z是我的C类中的预定义变量。我的目标是解析这个文件,使得int x的值为3,y的值为5.0,z的值为4.任何以%开头的行最终都会被忽略
我已经设法使用fgets和sscanf来做到这一点 - 这是尝试:
while (!feof(inputFile)) {
fgets(ch,500,inputFile);
if (sscanf(ch, "x %d", &x)) {
printf("x: %d\n", x);
} else if (sscanf(ch, "y %lf", &y)) {
printf("y: %lf\n", y);
} else if (sscanf(ch, "z %d", &z)) {
printf("z: %d\n", z);
}
并打印出所需的结果。但是现在我尝试使用fgets和strtok,因为我不认为我可以使用上面的代码来处理矩阵(即如果我在输入文件中(注意,在这种情况下,a也将是在我的c文件中预定义):
a
1 -1 3
2 1 6
9 3 0
我想将这些值存储在一个3x3矩阵中,我认为使用sscanf是不可能的(特别是如果矩阵的尺寸是可变的 - 但它总是一个n * n矩阵)。我尝试使用fgets和strtok是:
while (!feof(inputFile)) {
fgets(ch,500,inputFile);
token = strtok(ch, " ");
while (token) {
if (strcmp(token, "x")) {
printf("%s", "x found");
// Here is my problem - how do I look at the next token where the value for x is stored
}
token = strtok(NULL, " ");
break;
}
break;
}
我的代码中的问题在评论中说明。我已经考虑了一段时间,尝试了各种各样的事情。我认为困难来自于理解strtok如何工作 - 最初我试图将每个令牌存储到数组中。
在帮助我弄清楚如何复制现有代码以使用strtok而不是sscanf时,我们非常感谢任何帮助,以便我可以解析矩阵。
我知道那里有一些解析问题,但我没有看到任何解决如何解析矩阵的问题。
由于
答案 0 :(得分:0)
首先将该行分成一个令牌数组。然后,根据第一个令牌,您可以使用strtol
到strtod
来转换剩余的令牌。以下代码演示了如何将输入行分解为标记数组
char line[500];
char *token[200];
int tokenCount = 0;
while ( fgets( line, sizeof line, fp ) != NULL )
{
token[0] = strtok( line, " " );
if ( strcmp( token[0], "%" ) == 0 ) // skip comments
continue;
// break the line into tokens
int i;
for ( i = 1; i < 200; i++ )
if ( (token[i] = strtok( NULL, " " )) == NULL )
break;
tokenCount = i;
// output the token array
for ( i = 1; i < tokenCount; i++ )
printf( "%s: %s\n", token[0], token[i] );
}
for
循环生成一个从1到200的数组索引。strtok( NULL, " " )
从行中提取下一个标记,并返回指向该标记的指针(如果有,则返回NULL
没有更多的代币)。返回的值存储在token[i]
中。如果返回值为NULL
,则循环中断。