2009-11-14 39 views
2

现在我使用:如何检索C中的数据而不是整行?

char record[BUFLEN]; 
    if(fgets(record, BUFLEN, fp) != NULL) { 

     /* some code */ 

    } 

摆脱输入线,如:

city=Boston;name=Bob;age=35 
city=New York;name=Michael;age=29 

我可以用别的东西用C,会给我不要整个行,直到“\ n”,但单独对如:“城市=波士顿”,然后“名称=鲍勃”等?

回答

1

查看strtok()功能。连续调用将从字符串中检索每个令牌。

使用你的例子:

char record[BUFLEN]; 
if(fgets(record, BUFLEN, fp) != NULL) { 
    char *token; 

    token = strtok(record, ";"); 
    while (token != NULL) 
    { 
      doSomethingWith(token); 
      token = strtok(NULL, ";"); 
    } 
} 
+0

你仍然要阅读完整的线,然后记号化它。它听起来像OP不想首先阅读完整的文本行。 – dice 2009-11-14 21:28:59

+0

我正在摔跤。既然你已经提供了满足这个标准的答案,我们的OP有两个不同的观点要考虑,这取决于避免缓存整条线的重要性。 – 2009-11-14 21:32:08

2

,你可以在同一时间使用龟etc阅读一个字节。

阅读到= =成一个数组然后up up;在另一个

 do { 
      c = fgetc (pFile); 

      if (c == ';') 
      // etc 

     } while (c != EOF); 
+0

经过额外的考虑,我比你更喜欢你的答案。我将作为替代品离开我的地方。 – 2009-11-14 21:35:12

0

您可能会重复fgets()的功能,只有它指定的分隔符“fget”,而不是\ n。代码看起来像(这是PSEUDOCODE):

在此功能中,“DELIM”是您要使用的分隔符。而不是\n,它可能是;

char *GOEfgets(char *buf, int BUFLEN, FILE *fp, char DELIM) 
{ 
    int i = 0; /* counter */ 
    int character; 

    while(character = fgetc(fp)) /* we get a char from the stream one at a time */ 
    { 
     buf[i] = (char)character; /* store that character in the stream */ 

     if ((char)character == DELIM) /* if we run into our delimiter, we stop */ 
     { 
     return buf; 
     } 
    } 

} 
3

这看起来像scanf()可以使用的那些比较罕见的场合之一。

你可以尝试:

while (fscanf(fp, "%[^=]=%[^;]", name, value) == 2) 
{ 
    if ((c = fgetc(fp)) == EOF) 
     break; 
    else if (c == ';') 
     ...continue with same line... 
    else if (c == '\n') 
     ...wrap up current line... 
    else 
     ...congratulations - format error of some sort... 
} 

或者,继续使用 '与fgets()',但类似这样的循环中使用 '的sscanf()'。

工作演示代码:

#include <stdio.h> 
int main(void) 
{ 
    char name[20]; 
    char value[20]; 

    while (fscanf(stdin, "%19[^=]=%19[^;]", name, value) == 2) 
    { 
     int c; 
     if ((c = fgetc(stdin)) == EOF) 
      break; 
     else if (c == ';') 
      printf("name = %s; value = %s\n", name, value); 
     else if (c == '\n') 
      printf("name = %s; value = %s\n", name, value); 
     else 
      fprintf(stderr, "Ooops!\n"); 
    } 
    return(0); 
} 
+0

+ 1不错的代码,'scanf'也是IMO的正确工具。为什么有人会为这种简单的情况实施手动解析:) – AraK 2009-11-14 22:38:45

+0

+1你已经向我展示了我的C多么生疏。 – dice 2009-11-15 10:13:50