1. 程式人生 > >C/C++中相對路徑與絕對路徑以及斜槓與反斜槓的區別

C/C++中相對路徑與絕對路徑以及斜槓與反斜槓的區別

1 絕對路徑與相對路徑

絕對路徑表示相對容易得多,依次將檔案所在碟符資料夾逐級展開就是絕對路徑:

ofstream infile("E:\\MyDoc\\file.txt", ios::in);
Mat image = imread("D:\\MyImages\\Lena.jpg");

這裡需要注意的是資料夾與資料夾之間的間隔符要用雙斜槓\\,C++中預設訪問目錄是生成工程可執行檔案所在的目錄,我們記為當前目錄,相對路徑按照相對於當前目錄的位置大致可以分成三種:

  • 讀取路徑與當前目錄同級時,可以直接訪問預操作檔名:
infile.open("file2.txt", ios::in);  // file2.txt in the default directory
  • 讀取路徑在當前目錄的子目錄中時:
// file3.txt in the sub-directory named "SubDirectory" of the default directory
infile.open(".\\SubDirectory\\file3.txt", ios::in);  // "." means the default directory

// so, for file2.txt also can be:
infile.open(".\\file2.txt", ios::in);
  • 讀取路徑在當前目錄的上一級或幾級目錄(稱之為父目錄)中時:
// file4.txt in the parent directory named "ParentDirectory" of the default directory
infile.open("..\\ParentDirectory\\file4.txt", ios::in); // ".." means parent directory infile.open("..\\..\\ParentDirectory\\file5.txt", ios::in) // file5.txt in the parent directory of file4.txt

2 正斜槓與反斜槓

正斜槓,又稱左斜槓,符號是/;反斜槓,也稱右斜槓,符號是\

在Unix/Linux中,路徑的分隔採用正斜槓/,比如/home/myDocs;而在Windows中,路徑分隔採用反斜槓\,比如C:\Windows\System

程式設計時,我們常看到這樣的路徑寫法,C:\\Windows\\System,也就是用兩個反斜槓來分隔路徑,事實上,上面這個路徑可以用C:/Windows/System來代替,不會出錯。但是如果寫成了C:\Windows\System,那就可能會出現各種奇怪的錯誤了。至於上述問題出現的原因,要從字串解析這方面來分析。學過程式設計的人都應該知道,C中定義了一些字母前加\來表示常見的那些不能顯示的ASCII字元,如\0\t\n等,就稱為轉義字元,因為後面的字元,都不是它本來的ASCII字元意思了。根據這個原理,如果想輸出雙引號(""),就需要輸入'\"',這樣才會將包含了雙引號的字串正確的寫入記憶體中。那麼如果想輸入一個反斜槓呢?很簡單,只要敲\\就可以了。

看到這裡或許有些人已經看出眉目了,如果C:\Windows\System這個路徑字串交給C編譯器編譯,實際寫入記憶體的字串並沒有包含反斜槓\,甚至緊跟在反斜槓後面的字母也一起被轉義成了其它的字元,再次呼叫的話勢必會出問題。

字串解析不僅僅侷限於C編譯器,Java編譯器、一些配置檔案的解析、Web伺服器等等,都會遇到對字串進行解析的這個問題,由於傳統的Windows採用的是單個斜槓的路徑分隔形式,導致在對檔案路徑進行解析的時候可能發生不必要的錯誤,所以就出現了用雙反斜槓\\分隔路徑的形式。不管解析引擎是否將反斜槓解析成轉義字元,最終在記憶體中得到的都是\,結果也就不會出問題了。

由此也可以看出Windows或者說DOS在設計初期考慮不夠周全,為了和Unix一些特徵區別開來,將Unix中的正斜槓/分隔路徑方式改變成了反斜槓\。這樣改變導致的一個問題就是在早期DOS命令列中,正常的檔名是不能包含空格的,如果包含了空格,會導致輸入這樣的檔名時,命令解析無法將其和引數區分開。例如,想要進入hutaow yuan這個目錄(在此先忽略8.3命名規則),直接輸入cd hutaow yuan,命令列會將其解析為進入hutaow目錄,而後面的yuan做引數,這顯然不是所期望的。   

而在Unix中,檔名如果包含空格,可以直接在空格前加上反斜槓\進行轉義,從而很好的和命令引數區別出來(引數之間一般使用空格分隔)。還是上面的例子,在Unix中,只要輸入cd hutaow\ yuan(在yuan前面的空格前加上\),命令列會正確的辨認出hutaow yuan並進入這個目錄。當然,現在Windows的後續版本已經使用其它方法(比如檔名用雙引號括住)解決了空格問題。

參考資料: