2012-03-01 16 views
2

以下のコードに示すように、スラッシュが1つしかないファイルパスをダブルスラッシュに変換しようとしています。 それは私の最後で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 :: < _Elem、_Traits、_Ax> &のstd ::のbasic_string < _Elem、_Traits、_Ax> ::置き換えをのbasic_stringを(unsigned int型、unsigned int型、constの_Elem *、unsigned int型)」:からパラメータ1を変換することはできません 'のstd :: _ St​​ring_iterator < _Elem、_Traits、_Alloc>

+0

使用[この](のhttp:// WWW。 boost.org/doc/libs/1_49_0/doc/html/boost/algorithm/replace_all.html)。 search-replace-repeatアルゴリズムよりもはるかに優れています。 –

答えて

2

replaceは、一つの文字を置き換えることはできません'\\'を持つ2つの文字"\\\\"。テンプレートメソッドのシグネチャには、最後の2つのパラメータにはconst T&が必要ですが、文字の代わりに文字列を渡しています。

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

これは 'file_pathでなければなりません。insert(p、 "\\\\"); ' –

+0

@AgnelKurianいいえ、実際はそうではありません。もう1つのスラッシュは既にあります。 – dasblinkenlight

+0

右私は今それを理解する。 –

1

unsigned int型 '' に' あなたは置き換えるしようとしています文字列置換を伴うchar型は、型が同じであることが必要です。
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

解決策を提案することもお勧めです。ここでは、 ''\\''を '' \\ "'に置き換えてコードを動作させます。 –

+0

@MatthieuM:それはそのようには機能しませんでした(実行時エラーを出しました)。それ以外の方法は丸みを帯びていましたが、パス内のすべての文字を '\'に置き換えました – John

+2

'char * 'は' char'に割り当てることはできません。これは 'std :: string'。 @MatthieuM。 – hmjd

0

copyreplacetransformおよび他のいくつかのアルゴリズムは、その入力範囲内に存在するよりも多くの要素を作成することはできません。ここで

はあなたが必要なものを行うことができる方法です。 (私の頭の上から、私はこれを許可行う任意の標準的なアルゴリズムを考えることはできません)

あなたはこれを行うにはregex_replaceを使用することができます。

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

コンパイラはregex_replaceがstdのメンバーではないと言います – John

+0

'#include '。 VS2010より前のバージョンのVSを使用している場合は、 'std :: tr1'バージョンを使用する必要があります。 – bames53

関連する問題