2

现在我使用:

    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

4 回答 4

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);
}
于 2009-11-14T22:34:07.953 回答
2

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

将直到 = 读入一个数组,然后直到 ; 在另一个

        do {
          c = fgetc (pFile);

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

        } while (c != EOF);
于 2009-11-14T21:27:30.313 回答
1

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

使用您的示例:

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

    token = strtok( record, ";" );
    while ( token != NULL )
    {
            doSomethingWith( token );
            token = strtok( NULL, ";" );
    }
}
于 2009-11-14T21:26:13.543 回答
0

您可能会复制 fgets() 的功能,仅通过您指定的分隔符将其“fget”,而不是 \n。代码看起来像(这是伪代码):

在此函数中,“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;
      }
   }

}
于 2009-11-14T21:43:10.287 回答