C++ C++;复制文件的代码::混淆相对地址(tilde)

C++ C++;复制文件的代码::混淆相对地址(tilde),c++,file-io,relative-path,file-copying,tilde,C++,File Io,Relative Path,File Copying,Tilde,我写了一个简单的程序来复制文件。 它得到两个字符串: 1) 用于源文件的路径 2) 表示副本文件的名称 当我给它指定绝对或相对路径(没有波浪符号(~)时,它工作正常 但是当我给它一个带有波浪号(~)的相对路径时,它找不到文件的地址。这让我很困惑 以下是我的示例输入: 1) /Users/mahan/Desktop/Copy.cpp 2) ~/Desktop/Copy.cpp 第一个可以正常工作,但第二个不行 这是我的代码: #include <iostream> #include &

我写了一个简单的程序来复制文件。 它得到两个字符串:

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();
    }
}
#包括
#包括
使用名称空间std;
int main()
{
字符串路径,复制名称;
cin>>路径>>复制\u名称;
ifstream我的_文件;
流副本(副本名称);
my_file.open(路径);
if(my_file.is_open())
{

复制您用来自动扩展到
$HOME
目录的shell处理
~


std::ofstream
不处理文件路径中的
~
字符,因此只有第一个示例有效


如果您使用
argv[1]
从命令行将文件路径传递到程序,并从shell调用它,您将自动展开
~



如上所述,如果您想自己展开
~
字符,可以使用该函数确定
$HOME
的值,并将其替换为该值。

第二个示例不起作用,因为shell将
~
替换为
$HOME
,即到主目录的路径


fstream
对象不会执行此替换,而是查找实际名为
~
的目录,该目录可能不存在于您的工作目录中。

std::ofstream
无法处理
~
。它是指向
主目录的快捷方式。您需要提供主目录或子目录的绝对路径相对于代码运行目录的相对路径


例如,要给出相对路径,如果您正在
桌面
目录下运行代码,那么您不需要给出
~/Desktop/Copy.cpp
。只要给出
Copy.cpp
,它就足够了。

@BrunoParmentier是的,谢谢您指出。下次可以自由提出编辑。请注意,家庭环境变量可以由用户修改。用户无法更改由
getpwuid(getuid());
返回的
struct passwd
中的
pw_dir
项。