如何在C中检索数据而不是整行?

时间:2009-11-14 21:22:46

标签: c fgets

现在我使用:

    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'才能给我整行,但是单独的对象如:“city = Boston”然后“name = Bob”等等?

4 个答案:

答案 0 :(得分:3)

这看起来像是可以使用scanf()的相对罕见的场合之一。

你可以尝试:

while (fscanf(fp, "%[^=]=%[^;\n]", 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[^;\n]", 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);
}

答案 1 :(得分:2)

你可以使用fgetc一次读取一个字节。

读取直到=成一个阵列然后直到;在另一个

        do {
          c = fgetc (pFile);

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

        } while (c != EOF);

答案 2 :(得分:1)

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

使用您的示例:

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

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

答案 3 :(得分: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;
      }
   }

}