在路径名中使用波浪号(〜)打开ofstream

时间:2019-09-09 10:49:32

标签: c++ linux ofstream

我必须打开一些文件进行写入,并且其名称包含波浪号(~)。以下代码无法创建所需的文本文件。如果我将~替换为/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 个答案:

答案 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进行访问。