2017-09-03 36 views
0

我對轉義字符「\」及其與windows文件系統的關係感到非常困惑。在下面的例子:有人可以解釋有關Windows文件系統的C++轉義字符「」嗎?

char* fwdslash = "c:/myfolder/myfile.txt"; 
char* backslash = "c:\myfolder\myfile.txt"; 
char* dblbackslash = "c:\\myfolder\\myfile.txt"; 

std::ifstream file(fwdslash); // Works 
std::ifstream file(dblbackslash); // Works 
std::ifstream file(backslash); // Doesn't work 

我讓你在這裏做什麼轉義特殊字符,所以你可以在這個字符串中使用它。在沒有辦法通過放置一個反斜槓在字符串文本或std ::字符串你真的改變字符串---

---編輯:這是完全錯誤的,我的問題的根源---

因此,看起來轉義字符只能被某些類或事物處理爲除了反斜槓之外的其他內容,例如在控制檯上輸出,即std :: cout < <「\ hello」;將不打印反斜槓。在ifstream的情況下(或者我不確定是否同樣適用於C fopen()版本)),它必須是該類或函數將反斜槓視爲轉義字符。我想知道,因爲Windows文件系統使用反斜槓是不是有意義的,它接受帶反斜槓的簡單字符串,即「c:\ myfolder \ myfile.txt」?嘗試這種方式失敗。另外,在我的編譯器(Visual Studio)中,當我包含頭文件時,我可以使用。\和.. \來表示當前文件夾或父文件夾。我很確定在這裏與轉義字符無關,但是這些形式是Windows專用的,C預處理器的一部分還是C或C++語言的一部分?我知道反斜槓是Windows的東西,所以我看不到任何理由,即使在使用時,另一個系統會預期反斜槓。\和.. \

謝謝。

回答

4

決不在字符串文字中放置反斜槓[...]你是否 實際上改變字符串

你這樣做。 編譯器實際上修改了在嵌入到編譯程序之前編寫的文字。如果在解析源代碼時在字符串或字符文字中發現反斜槓,則會忽略,並且下一個字符會被專門處理。 \n成爲回車等。對於沒有特殊含義的威脅的逃脫字符是實現定義的。通常這意味着字符不變

您不能僅僅通過「c:\ myfolder \ file.txt」因爲它不是一個字符串,它將被程序看到。您的程序將會看到「c:myfolderfile.txt」。這就是爲什麼轉義反斜槓有特殊含義,允許將反斜槓嵌入到程序將看到的實際字符串中。

解決的辦法是要麼逃避你的反斜槓,或使用原始字符串(C++ 11日起):

#include指令
const char* path = R"(c:\myfolder\file.txt)" 

文件名不是字符串常量,即使他們是在形式上「path \ to \ header」,所以替代規則不適用於它們。

+0

我現在看到,我太笨了。這就是我困惑的原因。我試圖刪除我的問題的一部分,但我不知道如何。也許我應該刪除它。 – Zebrafish

+0

@斑胸魚通常你不應該刪除或破壞你的問題。其他人可能會擁有和你一樣的迷惑,你的問題和答案可以幫助他。 –

+0

那麼。\和.. \ C預處理程序特定? – Zebrafish

3

單反向斜線實際上逃脫了下一個字符。爲了擺脫這種行爲,你需要加倍逃避它。現在對於正斜槓來說,這可能是遵循Unix傳統的兼容性問題。

類似的事情,這也是在Java世界。在Windows和Unix上,一個正斜槓用於路徑分離,同時也是一個雙反斜槓。

爲了更清楚爲什麼單反斜線不工作,只記得下面的字符串實際上會產生一個換行符,一個反斜槓和一個標籤:

"\n\\\t" 

即像一個例子:

""c:\my\next\file.txt" 

實際上會產生:

"c:my 
ext 

ile.txt" 

(雙空間形式進料,請參閱here

+0

是的,我發現Windows也同時接受正斜槓。我不明白的是,你正在打開一個文件,而Windows本地系統使用反斜槓,爲什麼你不把它傳遞「c:\ myfolder \ file.txt」?添加轉義字符不會改變實際的字符串,它似乎只是某些「事物」使用「\」來表示轉義字符。 – Zebrafish

+0

@斑馬魚這沒有任何意義。反斜槓*總是*轉義,因爲它是字符串中反斜槓的屬性。字符串文字在哪個上下文中出現並不重要。如果您要循環使用單個反斜槓字符串,您會注意到不會出現反斜槓字符。 – Rakete1111

+0

@Rakete哦,我明白了。我完全錯了。它總是逃脫。所以我錯了我的問題,當我認爲反斜槓不會改變c字符串 – Zebrafish

0

因爲在聲明cstring文字時,反斜槓將轉義下一個字符,以用於特殊字符。這是所以你可以做換行符(\ n),空(\ 0),回車(\ r)等等

的char *反斜線=「C:\米 yfolder \米 yfile。文本」;

+0

我明白了,但反斜槓不會改變實際的字符串,只是某些事情將反斜槓視爲轉義字符以達到自己的目的,如cout。我想知道的是,如果Windows文件系統使用反斜槓,爲什麼它不只是一個字符串「c:\ myfolder \ myfile.txt」?我知道反斜槓會轉義,但只有某些事情會將反斜槓當作轉義字符。在這種情況下,似乎ifstream將其視爲轉義字符。 – Zebrafish

+0

爲什麼你說「反斜槓不會改變實際的字符串」?我認爲你對此感到困惑。字符串「n」與字符串「」\ n「'不完全相同;前者包含字母n,後者包含換行符。 –

+0

@哈利約翰斯頓謝謝。我現在看到了光。我完全錯誤地說,反斜槓實際上並沒有改變c字符串。我確實檢查過,我一定在某個地方搞砸了,或者是盲目的。 – Zebrafish