我需要从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。
提前致谢。
答案 0 :(得分:11)
如果您使用的是std :: string而不是C风格的char数组,则可以通过以下方式使用string::find_last_of和string::substr:
std::string str = "D:\\Devs\\Test\\sprite.png";
str = str.substr(0, str.find_last_of("/\\"));
答案 1 :(得分:4)
重型和跨平台的方式是使用boost::filesystem::parent_path()。但显然这会增加你可能不想要的开销。
或者你可以使用cstring的 strrchr 这样的函数:
include <cstring>
char * lastSlash = strrchr( str, '\\');
if ( *lastSlash != '\n') *(lastSlash +1) = '\n';
答案 2 :(得分:1)
编辑const字符串是未定义的行为,因此声明如下所示:
char str[] = "D:\\Devs\\Test\\sprite.png";
您可以使用1个以下的衬垫来获得所需的结果:
*(strrchr(str, '\\') + 1) = 0; // put extra NULL check before if path can have 0 '\' also
答案 3 :(得分:1)
在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;
}
答案 4 :(得分:0)
在Windows平台上,您可以使用 PathRemoveFileSpec或PathCchRemoveFileSpec 为达到这个。 但是为了便于携带,我会选择其他方法。
答案 5 :(得分:0)
现在,在C ++ 17中可以使用std::filesystem::path::parent_path
:
setlocale(LC_ALL, 'en_US.utf8')
答案 6 :(得分:-2)
您可以使用dirname获取父目录 查看此link了解详情
Raghu