2012-03-21 46 views
2

我对C程序解析为特定的关键字匹配文件的文件解析, 这里是我的示例代码...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; 
} 

Somefile.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包括类似“你好你好”的值,那么它只是解析“喜”只是,我想要解析x的全部价值而不会损失空间。

请给我建议解决方案。

谢谢。

+0

标准C没有真正为您想要的功能而设计的功能。但是几乎所有的编译器厂商都提供了* do *做你想做的功能。或者,阅读文件并自己进行格式解析。 – 2012-03-21 05:04:10

+0

http://stackoverflow.com/questions/6853789/how-do-i-scan-spaces-into-a-a-string – vrdhn 2012-03-21 05:25:02

回答

2

在这一行代码的:

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

%s意味着用一个词来读取。

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

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

好吧,是的,但这只会匹配'x ='行。 – 2012-03-21 05:11:48

+0

恩,这是@nimit已经有的确切代码,他唯一的问题是它没有阅读整行。这将解决这个问题。 – lnafziger 2012-03-21 05:14:58

+0

对于这个问题,如果你阅读这个问题(和给出的例子),他只需要x行。 – lnafziger 2012-03-21 05:16:29

0

做的第一件事就是背过上sscanf的。如果您阅读手册页,scanf将空格视为规格说明,“您在这里有一些空白空间,这不重要。”然后其他字符是文字的规格。结果是格式规范就像“任何数量的空间,然后是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 

等等。

+0

没有帮助,我只想解析x的值。 – Nimit 2012-03-21 05:21:47