2016-03-06 4 views
0

Я могу создать файлы, такие какC++ fstream открытым

f.open("file") 
f.open("./path/file") 
f.open("../path/file") 

но не

f.open("~/path...) 
f.open("/path...) 

Как получить абсолютные пути к работе?

+0

'~' интерпретируется оболочкой. Вот почему это не работает –

+2

'f.open (" ~/path ...) 'разрешающая директория' $ HOME' поддерживается только в оболочке. Не знаете, почему ваш второй случай не работает. –

ответ

4

По умолчанию 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);
1

С f.open("~/path/....") необходимо для вас, чтобы расширить ~ в коде. Обычно это делается путем вызова getenv("HOME") для извлечения домашнего каталога и замены каждого события '~' в пути с домашним каталогом.

При работе с абсолютными путями, например "/path/whatever", вам необходимо проверить, что f.open() преуспевает. Существуют различные причины, по которым может произойти сбой f.open(), включая контроль доступа (защиты, препятствующие открытию файла), файл, который уже открыт другим процессом, каталог не существует и т. Д.

Примечательно, что f.open() при попытке открыть файл в каталоге, требует, чтобы все каталоги в пути уже существовали. Он не будет использовать какую-либо магию, чтобы заставить их существовать. Если вы этого хотите, вам нужно его закодировать. Имейте в виду, что каждая фаза (создание каталогов и т. Д.) Может потерпеть неудачу.