2012-03-01 113 views
2

我想转换一个文件路径,只有一个斜杠为双斜线,如下面的代码所示。 但它给了我在最后显示的错误std :: replace给出了错误

#include<algorithm> 

    std::string file_path; 
    using std::replace; 
    while(fgets(fname_buffer,1024,flist)) 
    { 
    token = strtok(fname_buffer," ,\t"); 
    file_size=atol(token); 

    token = strtok(NULL, " ,\t"); 
    strncpy((char*)file_fp,token,32); 
    file_fp[32]='\0'; 

    token = strtok(NULL, "\n"); 
    file_path=token; 
    replace(file_path.begin(),file_path.end(),'\\',"\\\\"); 
    //file_path.replace(file_path.begin(),file_path.end(),'\\','\\\\'); 

错误C2664:“的std :: basic_string的< _Elem,_Traits,_AX> &的std :: basic_string的< _Elem,_Traits,_AX> ::更换(无符号整数,无符号整型,常量_Elem *,无符号整型)的std :: _ St​​ring_iterator < _Elem,_Traits,_Alloc>”不能转换参数1 '' 到 '无符号整型'

+0

使用[这里](HTTP:// WWW。 boost.org/doc/libs/1_49_0/doc/html/boost/algorithm/replace_all.html)。它比搜索替换重复算法好得多。 – 2012-03-01 17:36:24

回答

2

replace不能代替一个字符'\\'两个字符"\\\\"。模板方法的签名要求最后两个参数为const T&,但是您传递的是字符串而不是字符。

这里是你如何能做到你所需要的:

int p = 0; 
while ((p = file_path.find('\\', p)) != string::npos) { 
    file_path.insert(p, "\\"); 
    p += 2; 
} 
+0

这应该是'file_path。插入(p,“\\\\”);' – 2012-03-04 05:30:26

+0

@AgnelKurian否,不是真的:其他斜线已经存在。 – dasblinkenlight 2012-03-04 05:31:49

+0

对!我现在明白了。 – 2012-03-04 05:36:27

1

你试图取代带字符串的字符型 - 替换要求类型相同:
const T &在两种情况下,这应该是char

template < class ForwardIterator, class T > 
    void replace (ForwardIterator first, ForwardIterator last, 
       const T& old_value, const T& new_value); 

下面的代码片段可能对您有用:
(它通过重复调用std::string::replace()直到结束串)

std::string& sReplaceAll(std::string& sS, 
         const std::string& sWhat, 
         const std::string& sReplacement) 
{ 
    size_t pos = 0, fpos; 
    while ((fpos = sS.find(sWhat, pos)) != std::string::npos) 
    { 
     sS.replace(fpos, sWhat.size(), sReplacement); 
     pos = fpos + sReplacement.size(); 
    } 
    return sS; 
} 

你的情况,你可以使用这样的:

sReplaceAll(file_path, "\\", "\\\\");

+1

建议解决方案也很好,这里用'“\\”替换'\\''将使代码正常工作。 – 2012-03-01 17:10:19

+0

@MatthieuM:它没有这样工作(它给了运行时错误)。另一种方式工作,但用'\'代替了路径中的所有字符 – John 2012-03-01 17:16:30

+2

我不认为这将工作,因为'char *'不能被分配给'char',这是'std的元素:: string'。 – hmjd 2012-03-01 17:16:42

0

copyreplacetransform和其他一些算法不能创造出比它们的输入范围存在更多的元素。 (从我的头顶,我想不出任何标准算法那些允许这样)

您可以使用regex_replace做到这一点:

file_path = std::regex_replace(file_path,std::regex("\\"),"\\\\"); 
+0

编译器说regex_replace不是std – John 2012-03-01 17:34:00

+0

'#include '的成员。如果你使用VS2010以前的版本,你必须使用'std :: tr1'版本。 – bames53 2012-03-01 17:40:19