我必须打开一些文件进行写入,并且其名称包含波浪号(~
)。以下代码无法创建所需的文本文件。如果我将~
替换为/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();
}
有什么方法可以(轻松)处理名称为~
的文件?
答案 0 :(得分:9)
在文件系统级别,路径中的~
快捷方式并不是什么神奇的事物,打开~/GIT
实际上是试图访问~/GIT
,即:{ {1}}目录。您可以先创建GIT
和~
来进行验证。
在命令行中,~
通常由外壳程序解析。例如:在bash中:
〜:$ HOME的值
https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html
因此,要达到相同的效果,必须查询GIT
envvar,并替换路径中前导~
的用法:
$HOME
此外,在Linux上,wordexp函数可用于执行这些替换(〜替换为当前用户,〜other_user替换为其他用户的家)
答案 1 :(得分:4)
波浪号是 shell 扩展的一部分,它不是由底层操作系统处理的。您需要自己解决。
一种简单的方法是用环境变量"~/"
(如果存在)的内容替换前导 HOME
。
答案 2 :(得分:1)
代字号由shell扩展到主目录。 iostream不使用外壳,因此您必须注意它们的扩展。 Tilde实际上是在文件名中使用的有效字符,因此无需扩展就可以将文件创建到名为~
的目录中-如果该目录不存在,则失败。
C ++中没有用于Shell扩展的标准方法,也没有获取主目录的方法,但是POSIX系统中有几种方法:
wordexp
可能是这种情况下最有用的功能之一。您可以将路径传递给函数,它将扩展波浪号,变量和花括号。一个例子:
std::string full = dirname+filename+".txt"
wordexp_t p;
wordexp(full.c_str(), &p, 0);
std::string expanded = p.we_wordv[p.we_offs];
wordfree(&p);
std::ofstream log_file(expanded);
其他替代方法:
getpwuid
为您提供了一个以主目录为成员的结构。如果需要的话,它也可以用来获取另一个用户的主目录。
HOME
环境变量也应该可用。可以使用标准std::getenv
进行访问。