gpt4 book ai didi

c - 从 C 中的 stdin 读取数据

转载 作者:行者123 更新时间:2023-11-30 16:03:07 25 4
gpt4 key购买 nike

我正在尝试从stdin读取并输出数据,一切正常,除了它不输出新传入的数据。我不太确定问题出在哪里。我猜想它在确定 stdin 大小时起作用。任何帮助将不胜感激!谢谢

tail -f file | my_prog

已更新

#include <stdio.h>
#include <sys/stat.h>

long size(FILE *st_in) {
struct stat st;
if (fstat(fileno(st_in), &st) == 0)
return st.st_size;
return -1;
}

int main (){
FILE *file = stdin;
char line [ 128 ];

while ( fgets ( line, sizeof line, file ) != NULL )
fputs ( line, stdout ); /* write the line */

long s1, s2;
s1 = size(file);
for (;;) {
s2 = size (file);
if (s2 != s1) {
if (!fseek (file, s1, SEEK_SET)) {
while ( fgets ( line, sizeof line, file ) != NULL ) {
fputs ( line, stdout ); /* write the line */
}
}
s1 = s2;
usleep(300000);
}
}
return 0;
}

编辑:已修复!

最佳答案

FILE * 到达 EOF 后,它将保持在不再读取数据的状态,直到您使用 clearerr() 清除“EOF”位。或使用fseek()。但是,如果标准输入连接到终端,则该设备不是可查找设备,因此它可能不会执行任何有用的操作,而不是清除错误:

POSIX说:

The behavior of fseek() on devices which are incapable of seeking is implementation-defined.

您的循环进入条件值得怀疑;你需要在开始之前 sleep ,并且你需要在每次迭代时 sleep 。事实上,通常您编写 tail -f 时无需担心文件大小;您 sleep 时,尝试读取直到下一个“EOF”,重置文件 EOF 指示器,然后重复。另请注意,管道或终端的尺寸未定义。

<小时/>

另外,按惯例调用函数filenameFILE *参数;它的含义完全错误。文件名是一个字符串。

关于c - 从 C 中的 stdin 读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com