在C++中从文件获取父目录

uxhixvfz  于 2023-08-09  发布在  其他
关注(0)|答案(7)|浏览(187)

我需要从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。

hec6srdp

hec6srdp1#

如果你使用std::string而不是C风格的char数组,你可以按以下方式使用string::find_last_ofstring::substr

std::string str = "D:\\Devs\\Test\\sprite.png";
str = str.substr(0, str.find_last_of("/\\"));

字符串

ct2axkht

ct2axkht2#

现在,在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;
    }

字符串

fcy6dtqo

fcy6dtqo3#

重任务和跨平台的方式是使用boost::filesystem::parent_path()。但显然这会增加您可能不希望的开销。
或者,你可以使用cstring的**strrchr**函数,如下所示:

include <cstring>
char * lastSlash = strrchr( str, '\\');
if ( *lastSlash != '\n') *(lastSlash +1) = '\n';

字符串

kknvjkwl

kknvjkwl4#

编辑const字符串是未定义的行为,因此声明如下:

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

字符串
您可以使用下面的1行来获得您想要的结果:

*(strrchr(str, '\\') + 1) = 0; // put extra NULL check before if path can have 0 '\' also

v8wbuo2f

v8wbuo2f5#

在POSIX兼容的系统(*nix)上,有一个通用的函数可以用于这个dirname(3)。在Windows上有_splitpath
_splitpath函数将路径分为四个部分。

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;
}

whhtz7ly

whhtz7ly6#

在Windows平台上,您可以使用PathRemoveFileSpecPathCchRemoveFileSpec来实现这一点。然而,为了便于移植,我会使用这里建议的其他方法。

anhgbhbe

anhgbhbe7#

您可以使用dirname来获取父目录查看link以获取更多信息
拉古

相关问题