![](/img/trans.png)
[英]C++, how to provide the input filename from the command line, without hardcoding it in the program?
[英]How do you determine full paths from filename command line arguments in a c++ program?
我正在用C ++編寫一個程序,該程序在命令行上接受文件名作為參數:
>> ./myprogram ../path/to/file.txt
我知道我可以使用argv[1]
打開一個fstream,但是程序需要有關文件確切位置(即完整路徑名)的更多信息。
我曾考慮過將argv[1]
附加到getcwd()
,但是顯然在上面的示例中,您最終會得到/path/../path/to/file.txt
。 不知道fstream是否會自動解析該路徑,但是即使這樣做,如果沒有大量字符串處理,我仍然沒有完整的路徑。
當然,如果提供的路徑已經是絕對路徑,則該方法將根本無法工作。 而且由於該程序可以在Linux / Windows / etc上運行,因此僅檢測開始的'/'字符將無法確定該參數是否為完整路徑。
我認為這是處理多個操作系統上的路徑名相當普遍的問題。 那么, 如何獲取命令行參數的完整路徑名以及如何在操作系統之間進行處理呢?
路徑名處理是高度特定於OS的:有些OS的層次結構只有一個根(例如/在Unix上),有些OS則具有多個根(例如MS-DOS的驅動器號)。 有些可能具有符號鏈接,硬鏈接或其他類型的鏈接,這可能會使遍歷變得棘手。 有些甚至可能沒有指向文件的“規范”路徑的概念(例如,如果文件具有硬鏈接,則它具有多個名稱,沒有一個更像“規范”路徑)。
如果您曾經嘗試過在Java中跨多個操作系統進行路徑名操作,那么您就會明白我的意思了:-)。
簡而言之,路徑名處理是特定於系統的,因此您必須針對每個操作系統(系列)分別進行處理,或使用合適的庫。
編輯 :
您可以查看Apache Portable Runtime或Boost(盡管是C ++),它們都具有路徑名處理功能。
...您最終會得到/path/../path/to/file.txt。 不知道fstream是否會自動解析該路徑,但是即使這樣做,如果沒有大量字符串處理,我仍然沒有完整的路徑。
確實如此,您可以將/path/../path/用於所有您想要的東西而不會出現問題。
無論如何,C ++中沒有標准函數可以執行您想要的操作。 您將必須手動執行此操作,而這並非易事。.我建議您保持原樣,這不會造成任何問題。
它取決於操作系統。 如果您使用的是Linux,則可以查看realpath() 。 毫無疑問,Windows具有可比性。
AFAIK沒有標准方法。
但是,您可以嘗試這種方法(用偽代碼編寫):
string raw_dirname=get_directory_part(argv[1])
string basename=get_filename_part(argv[1])
string cwd=getcwd()
chdir(relative_dirname)
string absolute_dirname=getcwd()
chdir(cwd)
string absolute_filename=absulute_dirname + separator + basename
但是請注意:我不確定當符號鏈接起作用時是否存在問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.