2011-10-22 27 views
1

我有一个包含多行的文件。在文件解析中使用fgets()

我正在标记文件,如果标记包含.word,我想将行的其余部分存储在c字符串中。

所以如果: array: .word 0:10 我想存储0:10在一个C字符串。

我做了以下内容:

if (strstr(token, ".word")) { 
    char data_line[MAX_LINE_LENGTH + 1]; 
    int word_ret = fgets(data_line, MAX_LINE_LENGTH, fptr); 
    printf(".word is %s\n", data_line); 
} 

的问题,这是fgets()抓住下一行。我将如何获取当前行的剩余部分?那可能吗?

谢谢

+1

使用的'STR *'功能之一。 'strstr'在'token'中返回一个指向''.word''的指针,所以你可以使用该指针,跳过'“.word”'部分,并在那里寻找你想要的。 –

+0

哇,完全一样的解决方案,我:) –

+0

恐怕我们需要看到你是如何看你_current_线,以分配'token'。输入已经被这个点消耗了,你如何得到它取决于你如何保存它。顺便说一句,标记输入正是['flex'](http://en.wikipedia.org/wiki/Flex_lexical_analyser)被设计来完成的 - 当与['bison'](http://en.wikipedia。 org/wiki/GNU_bison),最终结果可能非常强大。 – sarnold

回答

3

strstr()返回一个指针,其中的第一个字符“:词”中找到。

这意味着,如果你添加的长度“:词”(5个字符),你会得到一个指向字符后“:词”,这是你想要的字符串。

char *x = strstr(token, ".word"); 
char *string_wanted = x + 5; 
+0

当然,你要检查NULL和东西。 –

1

一切很明显,你需要为每个你解析行用fgets只有一次,然后用其中的行存储缓冲器工作的第一位。

接下来有一整行你有几个选择:如果字符串格式是固定的(类似“.word”),那么你可以使用“strstr”函数的结果来定位“.word”的开头,提前6个字符(包括空格),并从找到的位置打印所需的单词。

另一种选择是比较复杂的,但实际上是一个liitle好一点。它使用“strtok”功能。

1

你需要已经读取输入到一个缓冲区,我假设是令牌,从那里你只是从strstr的返回值+“.word”的长度复制到结束缓冲区。这是我会怎么做:

char *location = strstr(token, ".word"); 
if (location != NULL) { 
    char data_line[MAX_LINE_LENGTH]; 
    strncpy(data_line, location + 5, MAX_LINE_LENGTH); 
    printf(".word is %s\n", data_line); 
} 

您可以添加5或6指针位置(取决于是否有是怎么回事“.word”之后有一个空格),以获得其余该线。

还要注意的是在函数strncpy和与fgets尺寸参数包括用于终止NUL字符空间。