Пути C++, начинающиеся с ~

Есть ли здесь возможность использовать пути, начинающиеся с "~" в кодах C++ в linux? Например, этот код не работает правильно:

#include <iostream>
#include <fstream>
using namespace std;

int main () 
{
  ofstream myfile;
  myfile.open ("~/example.txt");
  myfile << "Text in file .\n";
  myfile.close();
  return 0;
}

1 ответ

Решение

Я полагаю, вы работаете в системе Linux или POSIX с пониманием интерактивной оболочки ~ (например bash)

На самом деле, пути к файлам начинаются с ~ почти никогда не бывает (вы можете создать такой каталог с mkdir '~' в оболочке, но это было бы извращением). Помните, что ваша оболочка использует аргументы, поэтому ваша оболочка (а не ваша программа!) Заменяет ~ например /home/martin когда вы печатаете myprogram ~/example.txt как команда в вашем терминале. Смотрите глоб (7). Возможно, вы захотите использовать glob(3) или wordexp(3) внутри вашей программы на C++ (но вам нужно делать это только в том случае, если "~/example.txt" Строка происходит из некоторых данных - например, из некоторого файла конфигурации, из пользовательского ввода и т. д.)

Иногда вы можете просто использовать getenv(3) для получения домашнего каталога (или getpwuid(3) с getuid (2)). Возможно, вы могли бы сделать

std::string home=getenv("HOME");
std::string path= home+"/example.txt";
ofstream myfile(path);

Если вы серьезно, вы должны проверить, что getenv("HOME") не возвращается NULL, На практике это вряд ли произойдет.

Смотрите также это.

Другие вопросы по тегам