我正试图弄清楚这一点,并且现在已经困扰我了。
当我输入:
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();
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“无法加载”至少工作:)任何人都知道我缺少什么?
答案 0 :(得分:6)
当您在源代码中的字符串中使用反斜杠时,需要加倍反斜杠。编译器会将源代码中的每个双反斜杠转换为程序使用的字符串中的单个源代码。当您在运行时读取字符串时,不需要加倍反斜杠。
答案 1 :(得分:1)
// Now string srcLoc looks like: C:\\Users\Mark\\Desktop\\text.txt
这是不字符串在调试器中应该是什么样子(或在运行时的任何其他位置)。这只是带有反斜杠的字符串在源代码中的表示方式。
您尝试添加额外'\'
的循环也不起作用,因为编译器将删除单个反斜杠并将其替换为与转义序列对应的值(如果有)。例如,序列'\t'
被制表符替换。
您可以使用备用路径分隔符来解决您的问题
"C:/Users/Mark/Desktop/text.txt"
这适用于Windows,而不仅仅适用于Linux。