8

次のコードは、「不正なシーク」を出力します。

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    errno = 0;
    getchar();
    getchar();
    getchar();
    ftell( stdin );
    printf( "%s\n", strerror(errno) );
}

これは、実行cat script | ./a.outしたときだけでなく、実行したときにも発生します./a.out。もちろん、問題は ftell にあります。私の質問は:なぜこれが起こるのですか?stdinはシーク可能だと思います。fseek でも同じエラーが発生します。stdin がシーク可能でない場合、同じようなことを行う方法はありますか?

返信ありがとうございます。

4

1 に答える 1

14

fifo はシークできません。それらは単なるバッファです。データがread()fifo バッファから取得されると、それを取得することはできません。

プログラムを実行した場合は、次のことに注意してください。

./a.out < script

標準入力はfifoではなくファイルになるため、期待どおりに動作します。ftell()

于 2010-03-23T18:22:34.953 に答える