linux 打开路径名中带有波浪号(~)的ofstream [重复]

4uqofj5v  于 2023-03-07  发布在  Linux
关注(0)|答案(3)|浏览(204)

此问题在此处已有答案

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();
}

有什么方法可以(轻松地)处理名称中包含~的文件吗?

yqlxgs2m

yqlxgs2m1#

路径中的~快捷方式在文件系统级别并不神奇,打开~/GIT实际上是试图访问~/GIT,即:~目录中名为GIT的文件。您可以通过首先创建~GIT来验证这一点。
在命令行中,~通常由shell解析。例如:在bash中:
~:$HOME的值
https://www.gnu.org/software/bash/manual/html_node/Tilde-Expansion.html
因此,要达到相同的效果,必须查询$HOME envvar,并替换路径中前导~/的用法:

#include <stdlib.h>
const char* home = getenv("HOME")
if (home) { /* replace ~/ with home */ }

此外,在Linux上,可以使用wordexp函数来执行这些替换(~to current user,~other_user to home of other user)

vvppvyoh

vvppvyoh2#

波浪号是 shell 扩展的一部分,它不是底层操作系统处理的东西。你需要自己解决它。
一个简单的方法是用环境变量HOME(如果存在)的内容替换 leading"~/"

xoefb8l8

xoefb8l83#

tilde由shell扩展到主目录。iostream不使用shell,所以你必须为它们处理扩展。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目录为成员的结构,如果需要,也可以使用它来获取其他用户的home目录。
HOME环境变量也应该是可用的,它可以用标准的std::getenv来访问。

相关问题