【问题标题】:C: File parsing without losing white spaceC:文件解析不丢失空格
【发布时间】:2012-03-21 04:59:34
【问题描述】:

我正在解析 C 程序匹配特定关键字的文件, 这是我的示例代码...

#include <stdio.h>

int main() { 

    FILE *infile = fopen("Somefile.txt", "r");

    char buffer[256];
    char value[128];

    while (fgets(buffer, sizeof(buffer), infile))
        if (1 == sscanf(buffer, " x = %s", value))
            printf("Value = %s\n", value);
    return 0;
}

一些文件.txt

some junk
#a comment
a = 1 ; a couple other variables.
b = 2
x = 3
 x = 4
x=5
x = Hi hello

输出:

Value = 3
Value = 4
Value = 5
Value = Hi

问题:当 x 包含“Hi Hello”之类的值时,它只解析“Hi”,我想解析 x 的整个值而不丢失空间。

请给我建议解决方案。

谢谢。

【问题讨论】:

  • Standard C 没有真正为您设计的功能。但是几乎每个编译器供应商都提供了一个确实 做你想做的事情的函数。或者,读取文件并自己进行格式解析。

标签: c file-io fileparsing


【解决方案1】:

在这行代码中:

if (1 == sscanf(buffer, " x = %s", value))

%s 意思是读一个字。

如果您想阅读该行的其余部分,请像这样使用%[^\n]s

if (1 == sscanf(buffer, " x = %[^\n]s", value))

【讨论】:

  • 嗯,是的,但这只会匹配 'x =' 行。
  • 嗯,这是@nimit 已经拥有的确切代码,他唯一遇到的问题是它没有读取整行。这将解决这个问题。
  • 就此而言,如果您阅读问题(以及给出的示例),他只想要 x 行。
  • 是的,有人给了我-1,因为他们认为你想要的不仅仅是 x 行......当你尝试这个时结果是什么?它应该读到行尾。
  • @lnafziger:您的回答很有用。我得到了正确的结果。非常感谢。
【解决方案2】:

首先要做的是退出 sscanf。如果您阅读手册页,scanf 将空格视为说明“您将在此处有一些空白,这并不重要”的规范。然后其他字符是 literals 的规范。效果是该格式规范类似于“任意数量的 while 空格,然后是 x,然后是更多的空格,然后是 '=',然后是更多的空格,然后是字符串,现在返回字符串。”

您在这里真正想做的是一些轻量级的解析。您可能会更好地阅读每一行并使用简单的有限状态机对其进行扫描,即,

while not end of file
   while not end of line
      get next character
      if char == ";" -- comment
         break
      if char is a letter
         parse an assignment

等等。

【讨论】:

  • 没用,我只想解析 x 的值。
猜你喜欢
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2014-06-06
  • 1970-01-01
相关资源
最近更新 更多