我正在编写一个实用程序,它接受文件名或从标准输入读取。
我想知道检查标准输入是否存在(数据正在通过管道传输到程序)以及如果存在则读取该数据的最强大/最快的方法。如果不存在,则处理将在文件名上进行给予。我尝试使用以下测试来确定大小stdin
但我相信因为它是一个流而不是一个实际的文件,所以它没有像我怀疑的那样工作并且它总是在打印-1
。我知道我总是可以在 != EOF 时一次读取输入 1 个字符,但我想要一个更通用的解决方案,这样如果 stdin 存在,我最终可以得到 fd 或 FILE* ,这样程序的其余部分将无缝运行。我还希望能够知道它的大小,等待流已被前一个程序关闭。
long getSizeOfInput(FILE *input){
long retvalue = 0;
fseek(input, 0L, SEEK_END);
retvalue = ftell(input);
fseek(input, 0L, SEEK_SET);
return retvalue;
}
int main(int argc, char **argv) {
printf("Size of stdin: %ld\n", getSizeOfInput(stdin));
exit(0);
}
终端:
$ echo "hi!" | myprog
Size of stdin: -1
你想错了。
你正在尝试做什么:
如果 stdin 存在则使用它,否则检查用户是否提供了文件名。
你应该做什么:
如果用户提供文件名,则使用该文件名。否则使用标准输入。
除非您读取全部数据并对其进行缓冲,否则您无法知道传入流的总长度。你只是无法向后寻找管道。这是管道工作方式的限制。管道并不适合所有任务,有时需要中间文件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)