13

次のコマンドで開かれたファイルからメモリにデータを読み込んでいます。

FILE *f = fopen(path, "rb");

ファイルからバイトのコピーを開始する前に、次を使用して開始位置を探します。

/**                                                                                                                                                    
 * Goes to the given position of the given file.                                                                                                       
 *                                                                                                                                                     
 * - Returns 0 on success                                                                                                                              
 * - Returns -1 on EOF                                                                                                                                 
 * - Returns -2 if an error occured, see errno for error code                                                                                          
 * - Returns -3 if none of the above applies. This should never happen!                                                                                
 */                                                                                                                                                    

static int8_t goto_pos(FILE *f, uint64_t pos)                                                                                                          
{                                                                                                                                                      
        int err = fseek(f, pos, SEEK_SET);                                                                                                             

        if (err != 0) {                                                                                                                                
                if (feof(f) != 0) return -1;                                                                                                           
                if (ferror(f) != 0) return -2;                                                                                                         
                return -3;                                                                                                                             
        }                                                                                                                                              

        return 0;                                                                                                                                      
}

問題は、 を超える位置を探してもEOF、この関数が -1 を返さないことです。

参照によると、遭遇したfeofときにゼロ以外の値を返す必要がEOFあります。

どうしてこれなの?feof機能が役に立たない?


現在、 の戻り値を使用してfgetcをチェックしていることに注意してくださいEOF

4

4 に答える 4

5

EOF を超えてシークすると、後続の書き込み後にファイルが拡大するため、他の人が信じていることに反して、これは準拠しています。ここを参照してください: fseek

fseek() 関数を使用すると、ファイル位置インジケータをファイル内の既存のデータの末尾を超えて設定できます。この時点でデータが後で書き込まれる場合、データが実際にギャップに書き込まれるまで、ギャップ内のデータの後続の読み取りは値 0 のバイトを返します。

そのため、fseek は EOF を返すことができません。その位置または後ろに何も書き込まれていないときにその位置から読み取ろうとすると、後で EOF が発生します。したがって、これはすべて正しい動作です。

于 2018-10-23T12:52:26.293 に答える
2

一部のオペレーティング システムでは、ファイルの末尾を超えてシークすると、ファイルのサイズが大きくなります。ファイルを大きくするスペースがある限り、エラーが返されることはありません。

于 2013-06-23T20:04:43.480 に答える