我通过以下命令查看 C 语言的 getcwd 函数:
man 3 cwd
我怀疑 C++ 也有类似的函数,可以返回 std::string 类型的结果。
如果有的话,它叫什么名字?在哪里可以找到它的文档?
谢谢!
尽管你已经接受了一个答案,但我还是要回答。
比包装getcwd调用更好的方法是使用boost::filesystem,在那里你可以从current_path()
函数获得一个path
对象。Boost文件系统库允许你做很多有用的事情,否则你需要大量的字符串解析来完成,例如检查文件/目录是否存在、获取父路径、使路径完整等等。看看它吧,它也是可移植的 - 而大部分你可能会用到的字符串解析代码可能不是。
更新(2016):文件系统已经作为技术规范于2015年发布,基于Boost Filesystem v3。这意味着它可能已经与你的编译器一起发布了(例如Visual Studio 2015)。对我而言,它似乎也有可能成为未来C++标准的一部分(我认为是C++17,但我不清楚当前的情况)。
更新(2017):文件系统库已经在C++17中与ISO C++合并,为。
std::filesystem::current_path();
std::string
的构造函数可以安全地接受char*
作为参数。令人惊讶的是,Windows 版本也可以。
编辑:实际上这还有点复杂:
std::string get_working_path()
{
char temp[MAXPATHLEN];
return ( getcwd(temp, sizeof(temp)) ? std::string( temp ) : std::string("") );
}
内存不是问题--temp是一个基于栈的缓冲区,而std::string构造函数会进行一次复制。可能你可以一次完成,但我认为标准并不能保证这一点。
关于内存分配,通过POSIX:
getcwd()函数将当前工作目录的绝对路径名放置在由buf指向的数组中,并返回buf。复制到数组中的路径名不应包含任何符号链接组件。size参数是buf参数所指字符数组的字节数。如果buf是空指针,则getcwd()的行为是未指定的。
getcwd
作为无参数函数,但是我看到的文档显示有两个参数。我是否阅读了错误的文档? - Rob Kennedy让我们尝试将这个简单的C调用重写为C++:
std::string get_working_path()
{
char temp [ PATH_MAX ];
if ( getcwd(temp, PATH_MAX) != 0)
return std::string ( temp );
int error = errno;
switch ( error ) {
// EINVAL can't happen - size argument > 0
// PATH_MAX includes the terminating nul,
// so ERANGE should not be returned
case EACCES:
throw std::runtime_error("Access denied");
case ENOMEM:
// I'm not sure whether this can happen or not
throw std::runtime_error("Insufficient storage");
default: {
std::ostringstream str;
str << "Unrecognised error" << error;
throw std::runtime_error(str.str());
}
}
}
!= 0
而不是 == 0
。 - Phantrast你只需要编写一个小包装器。
std::string getcwd_string( void ) {
char buff[PATH_MAX];
getcwd( buff, PATH_MAX );
std::string cwd( buff );
return cwd;
}
std::string getcwd_string( void ) {
string ret(PATH_MAX,0);
getcwd( &ret[0], PATH_MAX );
ret.resize(ret.find_first_of('\0',0));
return ret;
}
需要避免使用VLA(变长数组),因为它在C++标准中并不是一个正式的部分,尽管大多数编译器都将其作为语言扩展进行支持。 - hanshenrik我在C语言中使用getcwd()
函数的方式如下:
char * cwd;
cwd = (char*) malloc( FILENAME_MAX * sizeof(char) );
getcwd(cwd,FILENAME_MAX);
stdio.h
。
当我使用C编译器时,它工作得很好。identifier "getcwd" is undefined
然后我包含了unistd.h
并使用C++编译器进行编译。
这次,一切都可以使用。
当我切换回C编译器时,它仍然可以正常工作!
只要同时包含stdio.h
和unistd.h
,上述代码就适用于C和C++编译器。
PATH_MAX
而不是 FILENAME_MAX
。 - Amir Fo所有的C函数也是C++函数。如果你需要一个std::string
,只需从getcwd
获取的char*
创建一个即可。
std::string cwd = boost::filesystem::current_path().generic_string();
std::string getcwd()
{
char* buff;//automatically cleaned when it exits scope
return std::string(getcwd(buff,255));
}
std::string cwd = getcwd();
并让构造函数完成它的工作? - LiraNuna