C ++ код для копирования файлов:: запутался относительно относительного адреса (тильда)

Я написал простую программу для копирования файлов.
Он получает две строки:

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();
}
}

2

Решение

~ обрабатывается оболочкой, которую вы используете для автоматического расширения на ваш $HOME каталог.

std::ofstream не справляется ~ символ в пути к файлу, таким образом, работает только ваш первый пример.


Если вы передаете путь к файлу вашей программе из командной строки, используя argv[1]и позвоните из своей оболочки, вы получите ~ автоматически расширяется.


С тем, что было сказано выше, если вы хотите расширить ~ характер, вы можете использовать std::getenv() функция для определения стоимости $HOMEи замените его на это значение.

6

Другие решения

Второй пример не работает, потому что оболочка — это то, что заменяет ~ с $HOMEпуть к вашему домашнему каталогу.

fstream объекты не будут выполнять эту замену и вместо этого будут искать каталог, который на самом деле называется ~, который, скорее всего, не существует в вашем рабочем каталоге.

0

std::ofstream не может справиться ~, Это ярлык для вашего home каталог. Вам нужно указать абсолютный путь к home или относительный путь по отношению к каталогу выполнения кода, чтобы он работал.

Чтобы указать относительный путь, например, если вы выполняете свой код в Desktop каталог, то вам не нужно давать ~/Desktop/Copy.cpp, Просто дай Copy.cpp и этого должно хватить.

0
По вопросам рекламы [email protected]