Почему это не открывает файл в каталоге программы?

У меня есть такая короткая программа:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>

int main (int argc, char * argv[]) {
  std::string homedir = std::getenv("HOME");
  std::string filename = argc > 1 ? argv[1] : (homedir + "/" + "file");
  std::cout << homedir << std::endl;
  std::cout << filename << std::endl;
  std::fstream file;
  file.open(filename, std::ios::out);
  file << "Yo yo waddup" << std::endl;
  file.close();
  return 0;
}

Когда я не указываю аргументов, он открывает файл в домашнем каталоге пользователя. В этом, конечно, есть смысл. Но когда я запускаю его из другого каталога, например:

$ ./folder/hometest examplefile

Программа создает «examplefile» в моем текущем каталоге вместо каталога, в котором находится программа.

Почему именно это происходит?


person Community    schedule 21.07.2017    source источник
comment
Это не похоже на вопрос конкретно о C ++. Вы получаете такое же поведение для всех остальных команд оболочки.   -  person Rakete1111    schedule 21.07.2017
comment
Нужно пройти вашу программу. Программы выглядят совершенно нормально. Работает как положено.   -  person Omkar Mozar    schedule 21.07.2017
comment
Глядя на ваш вопрос, я бы посоветовал вам получить путь к текущему рабочему каталогу и добавить его в путь к файлу o / p.   -  person Omkar Mozar    schedule 21.07.2017


Ответы (1)


Почему именно это происходит?

Программа ведет себя так, как ожидалось.

Файл открывается относительно текущего рабочего каталога, а не того места, где находится исполняемый файл.

Если бы это не сработало,

  1. Все ваши программы должны будут работать с абсолютными путями, или
  2. Расположение программы будет завалено файлами. Во-первых, это может быть невозможно из-за проблем с разрешениями. Во-вторых, в многопользовательской системе пользователи будут пытаться создать одинаковые имена файлов / каталогов.

Ничего из вышеперечисленного нежелательно.

person R Sahu    schedule 21.07.2017