fscanf解析文件中的设置

时间:2013-08-19 15:14:25

标签: c file-handling scanf

大家好日子 我有一个简单的问题..

如何让fscanf读取整个文件?

假设我有文件settings.txt

setting1 = 1
setting2 = 2
setting3 = 3

如何将它们解析为C编程变量?

int setting1, setting2,setting3;

我试着通过简单的方式做到这一点:

fscanf(fp, "setting2 = %d\n", &setting2);

但它不能从文件中获取thw值,而这是有效的:

fscanf(fp, "setting1 = %d\n", &setting1);

是否有正确的方法来阅读整个文件?

5 个答案:

答案 0 :(得分:3)

如何使用fgets()阅读每一行并使用sscanf()解析其内容,如下例所示: https://stackoverflow.com/a/861822/1150918 ? :)

另外,对于这种类型的配置,我更喜欢Lua或类似的小东西。内置语法检查,C API和小型解释器大小。

答案 1 :(得分:2)

首先,fscanf()没有任何问题。您应该知道的第一件事是fscanf将新行字符视为空格。因此,即使您将文件视为单独的行,fscanf也会将其视为:

  setting1 = 1  setting2 = 2  setting3 = 3

这不是问题,但它确实会影响您编写fscanf代码以读取此文本字符串的方式。下一个简单的方法太简单了?!

  fscanf(fp, " setting1 = %d", &setting1);
  fscanf(fp, " setting2 = %d", &setting2);
  fscanf(fp, " setting3 = %d", &setting3);

请注意。 fscanf的格式有一个领先的空间。这样扫描仪就可以找到无,一个或多个空格字符。如果文本文件的行具有前导空格,则除非前导空格为格式,否则将找不到匹配项。这很有道理,因为一行的开头可能有一些空格。

正确编码fscanf时,打开带有read和append的文件也有效。

让这个工作。现在,文件还有三个以上的设置吗?如果是这样,那么你的fscanf代码可能必须更复杂,但也许不是。记住,想法是读取数据,如果你的代码读取数据,那么你就完成了。

为了好玩,我尝试了以下fscanfs:

fscanf(fp, " setting1 = %i ", &setting1);
fscanf(fp, "setting2 = %i ", &setting2);
fscanf(fp, "setting3 = %i", &setting3); 

请注意,格式定义中“奇怪放置的空格允许每个关键字之间有一个或多个空格。

最后一条评论。您的代码应该考虑用户拼写错误的关键字,在这种情况下fscanf会失败。因此,始终存储或测试来自fscanf的返回值:

   int x;

   x = fscanf(fp, " setting1 = %d", &setting1);

   if (x == 0) { // keyword setting1 was misspelled...

对于当天的琐事:

  x = fscanf(fp, " s e t t i n g 1 = %d", &setting1);  // also works

答案 2 :(得分:1)

你想要这样的东西:

int setting[3], i;
for(i = 0; i < 3; ++i)
    fscanf(fp, "setting%*d = %d\n", &setting[i]);

答案 3 :(得分:1)

char line[1024];
int setting[N],i = 0;
while(fgets(fp,line,1024) != NULL)
{
     fscanf(line,"setting%*d = %d",&setting[i++]);
} 

答案 4 :(得分:1)

最佳方法是将文件I / O与解析分开并处理其各自的潜在错误。 IOWs:避免fscanf()

void Parse(FILE *fp, int NN) {
  char buf[100];
  int setting[NN];
  int i;
  for (i = 0; i < NN; i++) {
    if (fgets(buf, sizeof(buf), fp) == NULL ) {
      ;  // Handle unexpected I/O error
    }
    int n, count;
    unsigned u;
    count = sscanf(buf, "setting%u = %d", &u, &n);
    // Qualify the parse
    if ((count != 2) && (u <= 0) && (u > NN)) {
      ;  // Handle parse I/O error
    }
    setting[u - 1] = n;
  }
}