Я написал простую программу для копирования файлов.
Он получает две строки:
1) для пути к исходному файлу.
2) для имени файла копии.
Он работает правильно, когда я даю ему абсолютный или относительный путь (без знака тильды (~)).
Но когда я даю ему относительный путь со знаком тильды (~), он не может найти адрес файла. И это меня смущает!
Вот мой пример ввода:
1) /Users/mahan/Desktop/Copy.cpp
2) ~ / Desktop / Copy.cpp
Первый работает правильно, а второй нет.
И вот мой код:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
string path, copy_name;
cin >> path >> copy_name;
ifstream my_file;
ofstream copy(copy_name);
my_file.open(path);
if(my_file.is_open())
{
copy << my_file.rdbuf();
copy.close();
my_file.close();
}
}
~
обрабатывается оболочкой, которую вы используете для автоматического расширения на ваш $HOME
каталог.
std::ofstream
не справляется ~
символ в пути к файлу, таким образом, работает только ваш первый пример.
Если вы передаете путь к файлу вашей программе из командной строки, используя argv[1]
и позвоните из своей оболочки, вы получите ~
автоматически расширяется.
С тем, что было сказано выше, если вы хотите расширить ~
характер, вы можете использовать std::getenv()
функция для определения стоимости $HOME
и замените его на это значение.
Второй пример не работает, потому что оболочка — это то, что заменяет ~
с $HOME
путь к вашему домашнему каталогу.
fstream
объекты не будут выполнять эту замену и вместо этого будут искать каталог, который на самом деле называется ~
, который, скорее всего, не существует в вашем рабочем каталоге.
std::ofstream
не может справиться ~
, Это ярлык для вашего home
каталог. Вам нужно указать абсолютный путь к home или относительный путь по отношению к каталогу выполнения кода, чтобы он работал.
Чтобы указать относительный путь, например, если вы выполняете свой код в Desktop
каталог, то вам не нужно давать ~/Desktop/Copy.cpp
, Просто дай Copy.cpp
и этого должно хватить.