此问题在此处已有答案:
C++ paths beginning with ~ [duplicate](1个答案)
三年前关闭了。
我必须打开一个文件进行写入,它的名称包含波浪号(~
),下面的代码无法创建所需的文本文件,如果我用/home/oren
替换~
,那么一切都正常。
#include <fstream>
#include <string>
const std::string dirname = "/home/oren/GIT/";
// const std::string dirname = "~/GIT/";
const std::string filename = "someTextFile";
int main(int argc, char **argv)
{
std::ofstream log_file(dirname+filename+".txt");
log_file << "lorem ipsum";
log_file.close();
}
有什么方法可以(轻松地)处理名称中包含~
的文件吗?
3条答案
按热度按时间yqlxgs2m1#
路径中的
~
快捷方式在文件系统级别并不神奇,打开~/GIT
实际上是试图访问~/GIT
,即:~
目录中名为GIT
的文件。您可以通过首先创建~
和GIT
来验证这一点。在命令行中,
~
通常由shell解析。例如:在bash中:~:$HOME的值
https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html
因此,要达到相同的效果,必须查询
$HOME
envvar,并替换路径中前导~/
的用法:此外,在Linux上,可以使用wordexp函数来执行这些替换(~to current user,~other_user to home of other user)
vvppvyoh2#
波浪号是 shell 扩展的一部分,它不是底层操作系统处理的东西。你需要自己解决它。
一个简单的方法是用环境变量
HOME
(如果存在)的内容替换 leading"~/"
。xoefb8l83#
tilde由shell扩展到主目录。iostream不使用shell,所以你必须为它们处理扩展。Tilde实际上是一个有效的字符,可以在文件名中使用,所以如果没有扩展,文件将创建到名为
~
的目录中-如果目录不存在,则会失败。在C++中没有标准的shell扩展方法,也没有获取主目录的方法,但在POSIX系统中有几种方法:
wordexp
可能是这种情况下最有用的函数之一。您可以将路径传递给函数,它将展开波浪号、变量和大括号。示例:其他替代品:
getpwuid
提供了一个以home目录为成员的结构,如果需要,也可以使用它来获取其他用户的home目录。HOME
环境变量也应该是可用的,它可以用标准的std::getenv
来访问。