17

たとえば、あるstd::stringファイルへの UNIX スタイルのパスが含まれているとします。

string path("/first/second/blah/myfile");

ここで、ファイル関連の情報を破棄して、この文字列から 'blah' フォルダーへのパスを取得したいとします。それで、この文字列を切り捨てて"/first/second/blah"のみを含むようにする効率的な(「効率的」とは「コピーなし」を意味する)方法はありますか?

前もって感謝します。

4

2 に答える 2

33

N が既知の場合、次を使用できます。

path.erase(N, std::string::npos);

N が不明で、それを見つけたい場合は、任意の検索関数を使用できます。この場合、最後のスラッシュを見つけたいので、rfindorを使用できますfind_last_of:

path.erase(path.rfind('/'), std::string::npos);
path.erase(path.find_last_of('/'), std::string::npos);

イテレータに基づくこれのバリエーションもあります。

path.erase (path.begin() + path.rfind('/'), path.end());

そうは言っても、生計を立てるためにパスを操作する場合は、Boost Filesystemなど、このタスク用に設計されたライブラリを使用することをお勧めします。

于 2012-05-12T17:08:41.487 に答える
1

受け入れられた答えは確かに機能しますが、文字列の末尾を破棄する最も効率的な方法は、resizeメソッドを呼び出すことです。あなたの場合は次のとおりです。

path.resize(N);
于 2020-01-03T23:47:50.473 に答える