我真的很困惑转义字符“\”及其与windows文件系统的关系。在以下示例中:
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::string中放置反斜杠,您实际上是否更改了字符串--
--编辑:这是完全错误的,我的困惑之源
因此,转义字符似乎只被某些类或事物处理为反斜杠以外的其他意思,例如在控制台上输出,即:cout << "\hello";不会打印反斜杠。对于ifstream (或者我不确定case ()版本是否也适用),这个类或函数必须将反斜杠视为转义字符。我想知道,既然Windows文件系统使用反斜杠,那么接受带有反斜杠的简单字符串(即"c:\myfolder\myfile.txt“)难道没有意义吗?以这种方式尝试是失败的。
此外,在我的编译器(Visual )中,当我包含标题时,我可以使用.\和..\来表示当前文件夹或父文件夹。我很确定这中的\与转义字符无关,但是这些表单是特定于Windows、C预处理器的一部分,还是C或C++语言的一部分?我知道反斜杠是Windows的东西,所以我看不出任何其他系统会期望反斜杠的原因,即使在使用.\和..\时
谢谢。
发布于 2017-09-03 08:08:08
在字符串文字中放反斜杠是不可能的.你真的改变了字符串吗?
你知道的。实际上,编译器在将其嵌入编译程序之前会修改您编写的文字。如果在解析源代码时在字符串或字符文本中找到反斜杠,则忽略,和next字符将得到特殊处理。\n成为回车等,因为转义字符没有特殊意义的威胁是实现定义。通常它只是意味着性格不变。
您不能只是传递"c:\myfolder\file.txt“,因为它不是一个字符串,它将被您的程序看到。您的程序将看到"c:myfolderfile.txt“而不是。这就是为什么转义反斜杠有一个特殊的含义,允许将反斜杠嵌入到您的程序将看到的实际字符串中。
解决方案是要么转义反斜杠,要么使用原始字符串文本(C++11继续):
const char* path = R"(c:\myfolder\file.txt)"给#include指令的文件名不是字符串文本,即使它们是以"path\ to \header“的形式出现的,所以替换规则不适用于它们。
发布于 2017-09-03 07:55:37
单反斜杠实际上逃脱了下一个角色。为了摆脱这种行为,你需要加倍地逃避它。现在,对于正斜杠来说,这可能是一个遵循Unix传统的兼容性问题。
与此类似的事情在Java世界也是如此。在Windows和Unix上,一个正斜杠用于路径分离,而另一个反斜杠为双反斜杠。
要更清楚地说明为什么单个反斜杠不能工作,只需记住以下字符串实际上会生成一个换行符、一个反斜杠和一个制表符:
"\n\\\t"例如,在以下例子中:
""c:\my\next\file.txt"将实际产生:
"c:my
ext
ile.txt"(双空格是表单提要,参见这里)
发布于 2017-09-03 07:59:05
因为在声明cstring文本时,反斜杠会转义下一个字符,用于特殊字符。这样您就可以执行换行符(\n)、空行(\0)、回车(\r)等等.
char*反斜杠=“c:\my文件夹\myfile.txt";
https://stackoverflow.com/questions/46021357
复制相似问题