1

我试图弄清楚这一点,它困扰了我很长时间。

当我输入:

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();

我得到的是MessageBox“无法加载”至少可以工作:) 有人知道我错过了什么吗?

4

2 回答 2

6

在源代码中的字符串中使用反斜杠时,需要将它们加倍。编译器会将源代码中的每个双反斜杠转换为程序使用的字符串中的单个源代码。当您读取运行时传入的字符串时,您不需要将反斜杠加倍。

于 2012-03-28T18:33:47.003 回答
1
// Now string srcLoc looks like: C:\\Users\Mark\\Desktop\\text.txt

不是字符串在调试器(或运行时其他任何地方)中的样子。这只是带有反斜杠的字符串在源代码中的表示方式。

您尝试添加额外内容的循环'\'也不起作用,因为编译器将删除单个反斜杠并将其替换为与转义序列对应的值(如果有)。例如,该序列'\t'被一个制表符替换。

您可以通过使用备用路径分隔符来解决您的问题

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

这也适用于 Windows,而不仅仅是 Linux。

于 2012-03-28T19:43:02.237 回答