0

大家好,我有一个快速的问题..

如何让 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);

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

4

5 回答 5

3

在这个例子中 阅读每一行fgets()并解析它们的内容怎么样: https ://stackoverflow.com/a/861822/1150918 ?:)sscanf()

此外,对于此类配置,我个人更喜欢 Lua 或类似的小而简单的东西。内置语法检查、C API 和小型解释器。

于 2013-08-19T15:46:50.017 回答
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
于 2013-08-19T19:29:21.303 回答
1

The best approach is to separate file I/O from parsing and handle their individual potential errors. IOWs: avoid 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;
  }
}
于 2013-08-19T18:20:04.590 回答
1

你想要这样的东西:

int setting[3], i;
for(i = 0; i < 3; ++i)
    fscanf(fp, "setting%*d = %d\n", &setting[i]);
于 2013-08-19T15:53:21.593 回答
1
char line[1024];
int setting[N],i = 0;
while(fgets(fp,line,1024) != NULL)
{
     fscanf(line,"setting%*d = %d",&setting[i++]);
} 
于 2013-08-19T16:20:49.533 回答