2012-03-28 37 views
1

我想弄明白這一點,它現在已經很久了。fstream .open()Win32

當我鍵入:

inFile.open("C:\Users\Mark\Desktop\text.txt", ios::in | ios:: binary);

它工作得很好。 但是當我做這樣的事情。

string garbage = "\\";

 srcLoc = ofn.lpstrFile; // this is: C:\Users\Mark\Desktop\text.txt 

     // This for loop inserts "\\" 
     for(int i = 0; i < srcLoc.length(); i++) 
     { 
      switch(srcLoc[i]) 
      { 
      case '\\': 
       srcLoc.insert(i, garbage); 
       i++; 
       break; 
      } 
     } 
     // Now string srcLoc looks like: C:\\Users\Mark\\Desktop\\text.txt 
     inFile.open(srcLoc.c_str(), ios::in | ios:: binary); 
     // But it wont work 

     if(inFile) 
     { 
      while(!inFile.eof()) 
      { 
       getline(inFile, tekst); 
       SendMessage(hTextBox, EM_REPLACESEL, 0, (LPARAM)tekst.c_str()); 
       SendMessage(hTextBox, EM_REPLACESEL, 0, (LPARAM)"\r\n"); 
      } 
     } 
     else 
     { 
      MessageBox(0, srcLoc.c_str(), "Could not load", MB_ICONWARNING | MB_OK); 
     } 
     inFile.close(); 

我所得到的消息框「無法加載」的工作至少:)任何人都知道我缺少什麼?

+2

你應該只需要在字符串中加雙反斜槓,而不是已經正常的變量。 – 2012-03-28 18:34:36

+1

當您在文字字符串中使用'/'編碼文件路徑時,它也可以在Windows上運行,然後您不需要轉義所有反斜槓。 – Praetorian 2012-03-28 18:58:44

回答

6

當您在源代碼中的字符串中使用反斜槓時,需要加倍反斜槓。編譯器會將源代碼中的每個雙反斜槓轉換爲程序使用的字符串中的單個源代碼。當你讀取一個字符串在運行時進來,你做而不是需要加倍反斜槓。

+0

這就是我首先想到的。但以太辦法不行。 – Marko 2012-03-28 19:16:33

1
// Now string srcLoc looks like: C:\\Users\Mark\\Desktop\\text.txt 

這是字符串應該(在運行期間或其他地方)是什麼樣的調試器。這只是在源代碼中表示帶反斜槓的字符串的方式。

您的循環嘗試添加額外的'\'也不起作用,因爲編譯器將刪除單個反斜槓並將其替換爲對應於轉義序列的值(如果有)。例如,序列'\t'被製表符替換。

您可以通過使用備用路徑分隔符,而不是

"C:/Users/Mark/Desktop/text.txt" 

這適用於Windows以及解決您的問題,而不是隻爲Linux操作系統。

+0

但我可以喂「inFile.open()與」C:/Users/Mark/Desktop/text.txt「?看起來不起作用。 – Marko 2012-03-28 20:30:15

+1

是的,這應該工作(如果這是現有文件的實際路徑)。 – 2012-03-28 21:40:44