C 使用文件*f=stdin;

C 使用文件*f=stdin;,c,file,stdin,tail,fseek,C,File,Stdin,Tail,Fseek,我想(ed)用C语言实现POSIX-tail。如果输入是file(从argv接收的文件名),那么我使用fseek获取文件的末尾,所以实现起来很简单 但是当输入为stdin时,我不能使用fseek。我不知怎的发现我可以做到: FILE *f = stdin; 然后我可以使用stdin作为文件和fseek,一切都按预期工作(只需做一些小工作:D) 我的问题只是,这样可以吗?我的意思是(对我来说)像那样使用stdin有点不寻常。这不会有任何“安全”或其他错误吗?我对我的尾巴做了很多测试,它看起来即使

我想(ed)用C语言实现POSIX-tail。如果输入是file(从argv接收的文件名),那么我使用fseek获取文件的末尾,所以实现起来很简单

但是当输入为stdin时,我不能使用fseek。我不知怎的发现我可以做到:

FILE *f = stdin;
然后我可以使用stdin作为文件和fseek,一切都按预期工作(只需做一些小工作:D)


我的问题只是,这样可以吗?我的意思是(对我来说)像那样使用stdin有点不寻常。这不会有任何“安全”或其他错误吗?我对我的尾巴做了很多测试,它看起来即使在边缘情况下也能正常工作。

这确实是一件奇怪的事情,因为它没有帮助。
fseek
是否工作不受用作参数的变量名称的影响

如果句柄用于普通文件,则可以成功执行。
如果句柄不是用于普通文件,则无法成功

这适用于
fseek(stdin,…)
。(代码如下。)

$。/fseek\u stdin
如果(fseek(stdin,5,SEEK_CUR)<0){如果(fseek(f,5,SEEK_CUR)<0){
perror(“fseek”);perror(“fseek”);
返回退出失败;返回退出失败;
}                                                }
char*line=NULL;char*line=NULL;
尺寸n=0;尺寸n=0;
if(getline(&line,&n,stdin)<0{| if(getline(&line,&n,f)<0){
佩罗(“getline”);佩罗(“getline”);
自由线;自由线;
返回退出失败;返回退出失败;
}                                                }
printf(“%s”,第行);printf(“%s”,第行);
自由线;自由线;
返回退出成功;返回退出成功;
}                                                }

很好,这就是处理命名文件或stdin的程序正常工作的方式。
fseek
stdin
相关吗?查看@WeatherVane如果
stdin
被重定向到一个文件,为什么不相关?这个问题是关于stdin到终端的默认连接,但是如果您运行
tail
您可以使用
fseek()
@Barmar确实
0
没有返回。在无法查找的设备上,返回值未定义。
FILE *f;
if (...) {
   f = stdin;
} else {
   f = fopen(...);
}
void some_func(FILE *f) {
   ...
}

some_func(stdin);