0

fgetc にファイルを読み取らせ、特定のインジケーターから新しい行までスキップさせようとしています。これは簡単な質問のように思えますが、ドキュメントが見つかりません。

これが私の質問の例です:

これを読んでください。セミコロンから新しい行までスキップ

私の最善の解決策は、ファイル全体を読み取り、各行で strtok を使用して ; からスキップすることです。行の終わりまで。明らかに、これは恐ろしく非効率的です。何か案は?

*ファイルを文字ごとに解析するfgetcまたはfgetcのようなものを使用する必要があります

4

3 に答える 3

0
//Function of compatible fgets to read up to the character specified by a delimiter.
//However file stream keep going until to newline.
//s : buffer, n : buffer size
char *fgets_delim(char *s, int n, FILE *fp, char delimiter){
    int i, ch=fgetc(fp);

    if(EOF==ch)return NULL;
    for(i=0;i<n-1;++i, ch=fgetc(fp)){
        s[i] = ch;
        if(ch == '\n'){
            s[i+1]='\0';
            break;
        }
        if(ch == EOF){
            s[i]='\0';
            break;
        }
        if(ch == delimiter){
            s[i]='\0';//s[i]='\n';s[i+1]='\0'
            while('\n'!=(ch = fgetc(fp)) && EOF !=ch);//skip
            break;
        }
    }
    if(i==n-1)
        s[i] = '\0';
    return s;
}
于 2013-12-06T23:11:36.767 に答える
0

を使用する必要がある場合fgetc()、おそらく、行の最初のセミコロンまですべてをエコーし​​、セミコロンから行末まですべてを抑制することになっています。getc()これは and と機能的に同等であることに注意してください。fgetc()このコードは標準入力から読み取り、標準出力に書き込もうとしているためgetchar()、 andを使用するのが合理的putchar()です。でもルールはルール…

#include <stdio.h>
#include <stdbool.h>

int main(void)
{
    int c;
    bool read_semicolon = false;

    while ((c = fgetc(stdin)) != EOF)
    {
        if (c == '\n')
        {
            putchar(c);
            read_semicolon = false;
        }
        else if (c == ';')
            read_semicolon = true;
        else if (read_semicolon == false)
            putchar(c);
        /* else suppressed because read_semicolon is true */
    }
    return 0;
}

C99 と がない場合は、との代わりにとをそれぞれ<stdbool.h>使用できます。必要に応じて使用できます。int01boolfalsetrueelse if (!read_semi_colon)

于 2013-12-06T22:38:38.767 に答える