2012-03-28 79 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