10

C++のファイルから親ディレクトリを取得する必要があります。

例えば:

入力:

D:\Devs\Test\sprite.png

出力:

D:\Devs\Test\ [or D:\Devs\Test]

私は関数でこれを行うことができます:

char *str = "D:\\Devs\\Test\\sprite.png";
for(int i = strlen(str) - 1; i>0; --i)
{
    if( str[i] == '\\' )
    {
        str[i] = '\0';
        break;
    }
}

しかし、組み込み関数が存在することを知りたいだけです。私はVC++2003を使用しています。

前もって感謝します。

4

7 に答える 7

18

Cスタイルのchar配列の代わりにstd::stringを使用している場合は、string::find_last_ofstring::substrを次のように使用できます。

std::string str = "D:\\Devs\\Test\\sprite.png";
str = str.substr(0, str.find_last_of("/\\"));
于 2011-04-19T04:22:45.253 に答える
7

現在、C ++ 17では以下を使用できますstd::filesystem::path::parent_path

    #include <filesystem>
    namespace fs = std::filesystem;

    int main() {
        fs::path p = "D:\\Devs\\Test\\sprite.png";
        std::cout << "parent of " << p << " is " << p.parent_path() << std::endl;
        // parent of "D:\\Devs\\Test\\sprite.png" is "D:\\Devs\\Test"

        std::string as_string = p.parent_path().string();
        return 0;
    }
于 2020-11-21T20:02:44.497 に答える
4

ヘビーデューティーでクロスプラットフォームの方法は、boost :: filesystem :: parent_path()を使用することです。しかし、明らかにこれはあなたが望まないかもしれないオーバーヘッドを追加します。

または、cstringのstrrchr関数を次のように使用することもできます。

include <cstring>
char * lastSlash = strrchr( str, '\\');
if ( *lastSlash != '\n') *(lastSlash +1) = '\n';
于 2011-04-19T04:24:21.123 に答える
3

const文字列の編集は未定義の動作なので、次のように宣言します。

char str[] = "D:\\Devs\\Test\\sprite.png";

以下のライナーを使用して、目的の結果を得ることができます。

*(strrchr(str, '\\') + 1) = 0; // put extra NULL check before if path can have 0 '\' also
于 2011-04-19T04:21:06.167 に答える
3

POSIX準拠のシステム(* nix)には、このために一般的に使用可能な関数がありますdirname(3)。Windowsにはがあり_splitpathます。

_splitpath関数は、パスを4つのコンポーネントに分割します。

void _splitpath(
   const char *path,
   char *drive,
   char *dir,
   char *fname,
   char *ext 
);

したがって、結果(これはあなたが探していると思うものです)はになりますdir

次に例を示します。

int main()
{
    char *path = "c:\\that\\rainy\\day";
    char dir[256];
    char drive[8];
    errno_t rc;


    rc = _splitpath_s(
        path,       /* the path */
        drive,      /* drive */
        8,          /* drive buffer size */
        dir,        /* dir buffer */
        256,        /* dir buffer size */
        NULL,       /* filename */
        0,          /* filename size */
        NULL,       /* extension */
        0           /* extension size */
    );

    if (rc != 0) {
        cerr << GetLastError();
        exit (EXIT_FAILURE);
    }

    cout << drive << dir << endl;
    return EXIT_SUCCESS;
}
于 2011-04-19T04:24:54.570 に答える
2

Windowsプラットフォームでは、 PathRemoveFileSpecまたはPathCchRemoveFileSpecを使用 してこれを実現できます。ただし、移植性のために、ここで提案されている他のアプローチを使用します。

于 2017-08-30T18:54:04.497 に答える
-3

dirnameを使用して親ディレクトリを取得できます詳細については、このリンクを確認してください

ラグー

于 2011-04-19T04:25:40.547 に答える