【发布时间】:2015-10-05 23:05:16
【问题描述】:
目前正在尝试解析 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,以便我可以解析矩阵。
我知道有一些解析问题,但我还没有看到解决如何解析矩阵的问题。
谢谢
【问题讨论】:
-
首先将
while (!feof(inputFile)) { fgets(ch,500,inputFile);替换为while (fgets(ch,500,inputFile)) {(在某处可能有重复的帖子,why (!feof()) {...}总是错误的。) -
它是否有效地做同样的事情?我相信我最初尝试了后者并得到了一些奇怪的结果 - 但是很可能我搞砸了。会这样做,谢谢。
-
你知道
sscanf()的返回值是什么意思吧? 3 x 3 矩阵是什么意思,能举个例子吗? -
据我了解,它返回匹配的项目数 - 但我已经看到它使用了我在代码中使用它的方式。
-
while-feof-file-is-always-wrong 是 wildplasser 所指的帖子。看看
strtol和strtod来解决您的问题。