回答
无法正确输入文件名; shell会处理所有重定向的东西,而不会告诉你。
在直接< file
重定向的情况下,可以通过使用fstat
得到一个inode编号它,然后走在文件层次类似于find/-inum
获得与其匹配的路径检索与标准输入相关的文件路径。 (由于链接,可能会有多个这样的文件路径。)
但是,您不应该需要这样做。正如其他人所说,如果你需要知道文件名,你应该把文件名作为参数。
为什么你想这样做?所有程序a.out
从shell传递,是一个打开的文件描述符stdin。
用户不妨这样做:
cat inpfilename | ./a.out
,现在你绝对没有使用文件名中(除的/ dev /标准输入)。
如果a.out
需要使用文件名,为什么不把该文件作为命令行参数?
只有父shell才会知道。该程序,a.out总是会将其视为标准输入。
您的操作系统将为您的程序提供来自此文件的输入。这对您的程序是透明的,因此您不会看到文件的名称。事实上,在某些情况下,你会反馈输入,不来自文件,比如这个:
ls | ./a.out
什么你以后是非常系统特定的。可能更好的解决方案是将文件名作为参数传递。这样你得到文件名,你可以打开它来阅读内容。
正如您所说的那样,运行a.out的进程没有提供其标准输入的文件名的概念。
调用应该是:
$ ./a.out inputfilename
和int main(int argc, char* argv[]) { ... }
或
$ ./a.out <<< "inputfilename"
解析argv
,并从标准输入文件名。
然后在a.c中您需要fopen
该文件才能读取它的内容。
我不认为这是可能的,因为<
刚刚读到STDIN的inpfilename
的内容。
如果您希望inpfilename可用于您的程序,但您也希望能够接受来自STDIN的数据,请将程序设置为接受文件名参数并将其打开至FILE。如果没有参数给STDIN分配给你的文件。然后你的输入阅读程序使用fscanf这样的函数而不是scanf,并且你传入的文件是链接到fopened文件或STDIN的文件。
一种fstat(0,sb)
(0是标准输入文件描述符)会给你对输入文件的细节,大小,权限(称为模式)和器件的i节点驻留上。
反正你将不能够告诉它的路径:与unix的inode不知道他们属于哪个路径,并在技术上(见ln
),他们可能属于多个路径。
天儿真好,
如上回答所有你看到的是打开的文件描述符标准输入指出。
如果您确实想要这样做,您可以指定输入文件的第一行必须是文件本身的名称。
HTH
- 1. 输入重定向文件名C++
- 2. 重定向文件作为输入在C
- 3. 如何在shell中输出文件名?
- 4. 如果文件存在,输出在shell中重定向到另一个文件
- 5. 如何在c#中打印.htm文件?
- 6. 如何在c#中打印pcl文件?
- 7. 向量在c + +打印重复输入
- 8. 重定向空文件作为输入用C
- 9. 如何在Microsoft OneNote中插入MP4文件的打印输出
- 10. 如何在java中的文本文件中打印此输出?
- 11. shell文件重定向
- 12. 重定向打印到日志文件,也在子进程中
- 13. 如何将指定的行打印到shell中的新文件?
- 14. 如何使用_TCHAR *作为文件名打开文件? C/C++
- 15. 在bourne shell中重命名文件
- 16. 如何在打开的命令中输入OR文件名
- 17. 打印到Python中的文件:重定向vs打印文件参数vs写入
- 18. 将sql输出重定向到shell脚本中的文件
- 19. r用输入的文件名作为输出文件名
- 20. 如何在Qt中打印文本文件到打印机?
- 21. 在文件输入中输入文件
- 22. 在C++程序中打印.txt文件
- 23. 如何打印特定单词在文本文件中的Java
- 24. 重定向蟒蛇输出到文件打印两行
- 25. 如何在Java中打印JSON文件
- 26. 在bash中重复输入重定向到C++可执行文件
- 27. Linux中的文件输出重定向
- 28. 如何在C++中自动打开输入文件?
- 29. 如何打印文件中所有输入的计算得分?
- 30. 打印文件名
的“检索文件路径”的操作很可能是恶魔般的昂贵 - 加倍所以如果你有NFS文件系统上的大量扫描。此外,如上所述,它可能不会给你一个答案;例如,管道连接在文件系统中根本没有名称。 – 2009-11-14 14:02:29
是的,确实如此。这是一个全面的损失。 – bobince 2009-11-14 14:10:31