2

fgetc()、fgets()、fscanf()などの標準Cのファイル入力関数は、NUL('\ 0')文字に問題がありますか、それとも他の文字とは異なる方法で処理しますか?

fgets()を使用してNUL文字を含む可能性のある行を読み取ることができるかどうかを尋ねるつもりでしたが、その関数は入力をNULで終了し、他の方法で長さを返さないため、とにかく使用します。

代わりにfgetc()/ getc()/ getchar()を使用できますか?

4

3 に答える 3

2

あなたが読んでいるものが実際にテキストである場合、あなたはやや厄介な状況にあります。 fgetsNULを適切に読み取り、バッファに保存して、兵士をオンにします。ただし、問題は、Cライブラリが通常期待するNTBS(NULで終了するバイト文字列)ではなくなったものを読み込んだため、文字列を期待するほとんどの関数は、最初のNUL以降のすべてを無視することです。また、長さを取得するための信頼できる方法はありfgetsません。長さを返さずstrlen、C文字列を期待しているためです。(おそらく、毎回バッファをゼロにして、長さを取得するために最後の非NUL文字を探すことができますが、大きなバッファ内の短い文字列の場合、それはちょっと醜いです。)

バイナリを扱っている場合、物事ははるかに簡単です。あなたfreadfwriteデータ、そしてすべてが順調です。ただし、NULを含むテキストが必要な場合は、長さを返す独自のread-a-line関数が必要になる可能性があります。

于 2012-10-13T23:56:36.397 に答える
1

「TEXT」モードでファイルを開くと、NULL文字を超えてファイルを読み取ることはできません。ただし、バイナリファイルはopen()ed、read()、close()dにすることができます。これらの関数とバイナリi/oを調べてください。

また、TEXTファイルではEOF文字がNULL文字として設定されています。ただし、バイナリファイルのサイズをfstatを使用してクエリし、バイナリデータ(NULL文字を含む場合があります)を読み取ることはできます。

于 2012-10-13T23:10:17.603 に答える
0

いいえ、入力関数はNULを他の文字とは異なる方法で処理しません。ただし、不明な数の文字を返すものはNUL終了を使用するため、最も簡単な方法は、次のように独自の文字を作成することです。

ssize_t myfgets(char *buffer, size_t buffSize, FILE *file) {
    ssize_t count = 0;
    int character;
    while(count < buffSize && (character = getc(file)) != EOF) {
        buffer[count] = character;
        ++count;
        if(character == '\n') break;
    }
    if(count == 0 && character == EOF) return EOF;
    return count;
}

この関数はfgets、読み取った文字数を返し、文字列をNULで終了しないことを除いて、と似ています。文字列をNULで終了させる場合は、whileループの最初の条件をに変更し、ループの直後にcount < buffSize-1追加します。buffer[count] = '\0';

于 2012-10-13T23:38:29.827 に答える