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

「\n」までの行全体ではなく、「city=Boston」、「name=Bob」などのように別のペアを提供する C で何か他のものを使用できますか?

4

4 に答える 4

3

これは、scanf()を使用できる比較的まれなケースの1つに見えます。

あなたは試すことができます:

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 を使用して一度に 1 バイトずつ読み取ることができます。

まで = を 1 つの配列に読み込み、次にまで ; まで読み込みます。別の

        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()の機能を複製して、\ nではなく、指定した区切り文字でのみ「fget」することができます。コードは次のようになります(これは擬似コードです):

この関数で使用する区切り文字は「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 に答える