回答
無法正確輸入文件名; 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