ftell(stdin)导致非法搜索错误

时间:2010-03-23 18:15:48

标签: c file-io ftell

以下代码输出“非法搜寻”:

#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不可寻找,有什么方法可以做同样的事情吗?

感谢您的回复。

1 个答案:

答案 0 :(得分:12)

Fifos不可寻求。它们只是一个缓冲区。一旦来自fifo缓冲区的数据为read(),就永远无法检索它。

请注意,如果您运行了程序:

./a.out < script

然后标准输入将是文件而不是 fifo ,因此ftell()将执行您期望的操作。