Я могу создать файлы, такие какC++ fstream открытым
f.open("file")
f.open("./path/file")
f.open("../path/file")
но не
f.open("~/path...)
f.open("/path...)
Как получить абсолютные пути к работе?
Я могу создать файлы, такие какC++ fstream открытым
f.open("file")
f.open("./path/file")
f.open("../path/file")
но не
f.open("~/path...)
f.open("/path...)
Как получить абсолютные пути к работе?
По умолчанию std::fstream::open(filename)
открывает filename
для ввода и вывода. Следовательно, файл должен существовать, и вы должны иметь разрешение на запись .
В ваших случаях:
f.open("file")
f.open("./path/file")
f.open("../path/file")
вам повезло.
В вашем случае:
f.open("~/path...")
вы использовали путь-элемент ~
, что означает $HOME
в оболочке, но только средства в C++ ~
.
В случае:
f.open("/path...")
вам не повезло: либо файл не существует, или вы не имеете права на запись.
Если вы хотите открыть файл просто для ввода затем:
std::ifstream
std::fstream f; f.open(filename,std::ios_base::in);
Если вы хотите открыть файл просто для вывода затем:
std::ofstream
std::fstream f; f.open(filename,std::ios_base::out);
С f.open("~/path/....")
необходимо для вас, чтобы расширить ~
в коде. Обычно это делается путем вызова getenv("HOME")
для извлечения домашнего каталога и замены каждого события '~'
в пути с домашним каталогом.
При работе с абсолютными путями, например "/path/whatever"
, вам необходимо проверить, что f.open()
преуспевает. Существуют различные причины, по которым может произойти сбой f.open()
, включая контроль доступа (защиты, препятствующие открытию файла), файл, который уже открыт другим процессом, каталог не существует и т. Д.
Примечательно, что f.open()
при попытке открыть файл в каталоге, требует, чтобы все каталоги в пути уже существовали. Он не будет использовать какую-либо магию, чтобы заставить их существовать. Если вы этого хотите, вам нужно его закодировать. Имейте в виду, что каждая фаза (создание каталогов и т. Д.) Может потерпеть неудачу.
'~' интерпретируется оболочкой. Вот почему это не работает –
'f.open (" ~/path ...) 'разрешающая директория' $ HOME' поддерживается только в оболочке. Не знаете, почему ваш второй случай не работает. –