C++中相对路径与绝对路径以及斜杠与反斜杠的区别 及 处理代码
文件路徑正斜杠和反斜杠
正斜杠,又稱左斜杠,符號(hào)是"/";反斜杠,也稱右斜杠,符號(hào)是"\"。文件路徑的表示可以分為絕對(duì)路徑和相對(duì)路徑:
1、絕對(duì)路徑表示相對(duì)容易,例如
pDummyFile =fopen("D:\\vctest\\glTexture\\texture\\dummy.bmp", "rb");給出了從盤符開(kāi)始的全部路徑,這里需要注意的是“\”要用雙斜線"\\",vc工程默認(rèn)訪問(wèn)的目錄是工程目錄,相對(duì)路徑有以下多種形式,如:pDummyFile = fopen("dummy.bmp", "rb"); bmp文件就在vc工程目錄下,和dsw文件同屬一個(gè)目錄。
pDummyFile = fopen("..\\texture\\dummy.bmp", "rb");?表示bmp文件在工程目錄的同級(jí)目錄texture中,因此路徑是先退出工程目錄再進(jìn)入texture目錄訪問(wèn)到bmp文件。“..”表示退到當(dāng)前目錄的上一級(jí)目錄(父目錄)
????pDummyFile =fopen(".\\texture\\dummy.bmp", "rb");?表示bmp文件就在工程目錄的子目錄texture中,“.”表示當(dāng)前默認(rèn)目錄,即vc工程目錄,然后在進(jìn)入其子目錄texture訪問(wèn)到文件
注意,對(duì)相對(duì)路徑而言,路徑表示中的“\”也要用雙斜線"\\",
c++中\(zhòng)\是一種轉(zhuǎn)義字符,他表示一個(gè)\,就像\n表示回車一樣。
所以C++中的路徑名:
D:\matcom45\doc\users\_themes\m.dat
應(yīng)為:
CString filename=_T("D:\\matcom45\\doc\\users\\_themes\\m.dat");或
CStringfilename=_T("D:/matcom45/doc/users/_themes/m.dat");
"./"加不加都一樣,就是指當(dāng)前目錄
"../"表示當(dāng)前目錄的上級(jí)目錄,即當(dāng)前的父目錄。
?
在Unix/Linux中,路徑的分隔采用正斜杠"/",比如"/home/hutaow";而在Windows中,路徑分隔采用反斜杠"\",比如"C:\Windows\System"。
有時(shí)我們會(huì)看到這樣的路徑寫(xiě)法,"C:\\Windows\\System",也就是用兩個(gè)反斜杠來(lái)分隔路徑,這種寫(xiě)法在網(wǎng)絡(luò)應(yīng)用或編程中經(jīng)常看到,事實(shí)上,上面這個(gè)路徑可以用"C:/Windows/System"來(lái)代替,不會(huì)出錯(cuò)。但是如果寫(xiě)成了"C:\Windows\System",那就可能會(huì)出現(xiàn)各種奇怪的錯(cuò)誤了。至于上述問(wèn)題出現(xiàn)的原因,要從字符串解析這方面來(lái)分析。學(xué)過(guò)編程的人都應(yīng)該知道,在C里面,輸出字符串時(shí),如果想輸出一個(gè)換行,那就要加上'\n'這個(gè)標(biāo)志,類似的,輸出一個(gè)TAB,就加上'\t',也就是說(shuō),反斜杠("\")這個(gè)符號(hào)會(huì)把跟在它后面的字符結(jié)合起來(lái)轉(zhuǎn)義成其它字符。根據(jù)這個(gè)原理,如果想輸出雙引號(hào)('"'),就需要輸入'\"',這樣才會(huì)將包含了雙引號(hào)的字符串正確的寫(xiě)入內(nèi)存中。那么如果想輸入一個(gè)反斜杠呢?很簡(jiǎn)單,只要敲'\\'就可以了。
看到這里或許有些人已經(jīng)看出眉目了,如果"C:\Windows\System"這個(gè)路徑字符串交給C編譯器編譯,實(shí)際寫(xiě)入內(nèi)存的字符串并沒(méi)有包含反斜杠"\",甚至緊跟在反斜杠后面的字母也一起被轉(zhuǎn)義成了其它的字符,再次調(diào)用的話勢(shì)必會(huì)出問(wèn)題。
字符串解析不僅僅局限于C編譯器,Java編譯器、一些配置文件的解析、Web服務(wù)器等等,都會(huì)遇到對(duì)字符串進(jìn)行解析的這個(gè)問(wèn)題,由于傳統(tǒng)的Windows采用的是單個(gè)斜杠的路徑分隔形式,導(dǎo)致在對(duì)文件路徑進(jìn)行解析的時(shí)候可能發(fā)生不必要的錯(cuò)誤,所以就出現(xiàn)了用雙反斜杠"\\"分隔路徑的形式。不管解析引擎是否將反斜杠解析成轉(zhuǎn)義字符,最終在內(nèi)存中得到的都是"\",結(jié)果也就不會(huì)出問(wèn)題了。
由此也可以看出Windows或者說(shuō)DOS在設(shè)計(jì)初期考慮不夠周全,為了和Unix一些特征區(qū)別開(kāi)來(lái),將Unix中的正斜杠"/"分隔路徑方式改變成了反斜杠"\"。這樣改變導(dǎo)致的一個(gè)問(wèn)題就是在早期DOS命令行中,正常的文件名是不能包含空格的,如果包含了空格,會(huì)導(dǎo)致輸入這樣的文件名時(shí),命令解析無(wú)法將其和參數(shù)區(qū)分開(kāi)。例如,想要進(jìn)入"hutaow yuan"這個(gè)目錄(在此先忽略8.3命名規(guī)則),直接輸入"cd hutaow yuan",命令行會(huì)將其解析為進(jìn)入"hutaow"目錄,而后面的"yuan"做參數(shù),這顯然不是所期望的。
而在Unix中,文件名如果包含空格,可以直接在空格前加上反斜杠"\"進(jìn)行轉(zhuǎn)義,從而很好的和命令參數(shù)區(qū)別出來(lái)(參數(shù)之間一般使用空格分隔)。還是上面的例子,在Unix中,只要輸入"cd hutaow\ yuan"(在yuan前面的空格前加上"\"),命令行會(huì)正確的辨認(rèn)出"hutaow yuan"并進(jìn)入這個(gè)目錄。當(dāng)然,現(xiàn)在Windows的后續(xù)版本已經(jīng)使用其它方法(比如文件名用雙引號(hào)括住)解決了空格問(wèn)題。
-------------------------------------------------
C#:
using System; namespace HelloWorldApplication {class HelloWorld{static void Main(string[] args){/* 我的第一個(gè) C# 程序*/string AA = "aa\\bb\\cc\\";string kk = AA.Replace("\\","/");Console.WriteLine(AA);Console.WriteLine(kk);Console.ReadKey();}}輸出: aa\bb\cc\aa/bb/cc/
==============================================
C++
#include <iostream> #include <string> using namespace std; int main() { string::size_type pos=0; string test="fsffsfd\\fdsfsfd\\fdsfsd"; cout<<test<<endl; while((pos=test.find('\\',pos))!=string::npos) { test.insert(pos,"\\");//插入 pos=pos+2; } cout<<test<<endl; return 0; }fsffsfd\fdsfsfd\fdsfsdfsffsfd\\fdsfsfd\\fdsfsd
總結(jié)
以上是生活随笔為你收集整理的C++中相对路径与绝对路径以及斜杠与反斜杠的区别 及 处理代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python读取uci数据集
- 下一篇: delphi调用chrome内核进行浏览