【问题标题】:c++ Function to add an extra '\' to a filepath?c ++函数向文件路径添加额外的'\'?
【发布时间】:2016-04-13 05:53:27
【问题描述】:

我有大约 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 变量,这只是一个测试。

【问题讨论】:

  • 我怀疑您必须使用自己喜欢的文本编辑器或其他工具(例如 sed)来修改文件路径。
  • 在记事本中搜索和替换怎么样?
  • @marco 哇,我完全没想到。效果很好。
  • 请注意,标准路径分隔符 / 适用于 Windows,因此您只需将:C:\Users\Nick\Documents\ReadIns\NC_000852.gbk 更改为 C:/Users/Nick/Documents/ReadIns/NC_000852.gbk

标签: c++ file


【解决方案1】:

使用双反斜杠作为'\\'"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(), '\\', '/');

我假设您已经创建了一个包含单个反斜杠的文件,并且您正在使用该文件进行解析。
但是从您的 cmets 中,我注意到您显然是在运行时直接获取文件路径(即在运行 .exe 时)。在这种情况下,正如@MSalters 所提到的,您不必担心此类转换(即更改反斜杠)。

【讨论】:

    【解决方案2】:

    您看到的问题是因为在 C++ 中,字符串文字通常包含在 "" 引号中。这带来了一个小问题:当引号将结束字符串文字时,如何将引号放在字符串文字中。解决方案是使用\转义它。这也可用于向字符串添加一些其他字符,例如\n(换行符)。而且由于\ 现在在字符串文字中具有特殊含义,因此它也用于转义自身。所以"\\" 是一个只包含一个字符的字符串(当然还有一个尾随的 NUL)。

    这也适用于字符文字:char example[4] = {'a', '\\', 'b', 0} 是写"a\\b" 的另一种方式。

    现在这一切都与编译时间有关,此时编译器需要分离 C++ 代码和字符串内容。一旦您的可执行文件运行,反斜杠只是一个字符。 std::cout &lt;&lt; "a\\b" 打印一个反斜杠,因为内存中只有一个反斜杠。 std::String word; std::cin &gt;&gt; word 将读取一个单词,如果您输入一个反斜杠,那么 word 将包含一个反斜杠。编译器不参与其中。

    因此,如果您从 std::ifstream list_of_filenames 读取 3500 个文件名,然后使用它来创建另外 3500 个 std::ifstreams,您只需担心在代码中指定第一个文件名时使用反斜杠。如果你取而代之的是 argv[1] 的文件名,你根本不需要关心。

    【讨论】:

      【解决方案3】:

      摆脱对反斜杠进行特殊处理的一种方法是将所有文件名保存在单独的磁盘文件中,并使用文件流对象(如ifstream)来获取 C++ 格式的文件名。

      TCHAR tcszFilename[MAX_PATH] = {0};
      ifstream ObjInFiles( "E:\\filenames.txt" );
      ObjInFiles.getline( tcszFilename, MAX_PATH );
      ObjInFiles.close();
      

      假设 filenames.txt 中存储的第一个文件名为“e:\temp\abc.txt”,那么在执行上述getline() 后,变量tcszFilename 将保持“e:\\temp\\abc.txt” .

      【讨论】:

        猜你喜欢
        • 2023-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多