我有大约3500个完整文件路径来排序(ex. "C:\Users\Nick\Documents\ReadIns\NC_000852.gbk")
。我刚刚了解到c ++在读取文件路径时无法识别单个反斜杠。我正在阅读大约3500个文件路径,因此手动更改每个文件路径会非常繁琐。
我有这个for
循环,它找到单个反斜杠并在该索引处插入一个双反斜杠。这样:
string line = "C:\Users\Nick\Documents\ReadIns\NC_000852.gbk";
for (unsigned int i = 0; i < filepath.size(); i++) {
if(filepath[i] == '\') {
filepath.insert(i, '\');
}
}
但是,c ++,特别是c :: b,由于反斜杠字符而无法编译。有没有办法用函数添加额外的反斜杠字符?
我正在从文本文件中读取文件路径,因此它们被读入string filepath
变量,这只是一个测试。
答案 0 :(得分:2)
使用双反斜杠作为'\\'
和"C:\\Users..."
。因为下一个字符的单个反斜杠可以逃脱
此外,string::insert()
方法的第二个参数需要在代码中缺少的字符数
有了所有这些修复,它编译得很好:
string filepath = "C:\\Users\\Nick\\Documents\\ReadIns\\NC_000852.gbk";
// ^^ ^^ ^^ ^^ ^^
for (unsigned int i = 0; i < filepath.size(); i++) {
if(filepath[i] == '\\') {
// ^^
filepath.insert(i, 1, '\\');
} // ^^^^^^^
}
我不确定,上述逻辑将如何运作。但下面是我的首选方式:
for(auto pos = filepath.find('\\'); pos != string::npos; pos = filepath.find('\\', ++pos))
filepath.insert(++pos, 1, '\\');
如果您只需要替换单个字符(例如Linux系统或可能在Windows中支持);然后,您也可以使用std::replace()
来避免this answer中提到的循环:
std::replace(filepath.begin(), filepath.end(), '\\', '/');
我认为,您已经创建了一个包含单个反斜杠的文件,并且您正在使用它来进行解析 但是从你的评论中,我注意到你显然是在运行时直接获取文件路径(即运行.exe时)。在这种情况下,正如@MSalters所提到的,你不必担心这种转换(即改变反斜杠)。
答案 1 :(得分:1)
您所看到的问题是因为在C ++中,字符串文字通常包含在""
引号中。这引出了一个小问题:如果引用结束字符串文字,如何在字符串文字中放置引号。解决方案是使用\
转义它。这也可用于向字符串添加一些其他字符,例如\n
(换行符)。由于\
现在在字符串文字中具有特殊含义,因此它也用于转义自身。所以"\\"
是一个只包含一个字符的字符串(当然还有一个尾随的NUL)。
这也适用于字符文字:char example[4] = {'a', '\\', 'b', 0}
是另一种编写"a\\b"
的方法。
现在这完全是关于编译时,编译器需要分离C ++代码和字符串内容。运行可执行文件后,反斜杠只是一个字符。 std::cout << "a\\b"
打印一个反斜杠,因为内存中只有一个。 std::String word; std::cin >> word
会读取一个单词,如果输入一个反斜杠,则word
将包含一个反斜杠。编译器不参与其中。
因此,如果您从std::ifstream list_of_filenames
读取3500个文件名,然后使用它来创建另外3500个std::ifstream
,则只需要在代码中指定第一个文件名时担心反斜杠。如果你取代argv[1]
的文件名,你根本就不需要关心。
答案 2 :(得分:0)
摆脱反斜杠特殊处理的一种方法是将所有文件名保存在单独的磁盘文件中,并使用ifstream
等文件流对象来获取C ++格式的文件名。
TCHAR tcszFilename[MAX_PATH] = {0};
ifstream ObjInFiles( "E:\\filenames.txt" );
ObjInFiles.getline( tcszFilename, MAX_PATH );
ObjInFiles.close();
假设存储在filenames.txt中的第一个文件名是&#34; e:\ temp \ abc.txt&#34;在上面执行getline()
之后,变量tcszFilename
将保持&#34; e:\\ temp \\ abc.txt&#34;。