用于复制文件的C ++代码::对相对地址(代字号)感到困惑

时间:2015-05-23 14:36:49

标签: c++ file-io relative-path file-copying tilde

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

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

3 个答案:

答案 0 :(得分:6)

~由您用于自动展开到$HOME目录的shell处理。

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

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

根据上述内容,如果您想自己展开~字符,可以使用std::getenv()函数确定$HOME的值,并将其替换为该值

答案 1 :(得分:0)

第二个示例不起作用,因为shell用~取代$HOME,即主目录的路径。

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

答案 2 :(得分:0)

std::ofstream无法处理~。它是home目录的快捷方式。您需要提供home的绝对路径或相对于代码运行目录的相对路径才能工作。

提供相对路径,例如,如果您在Desktop目录中运行代码,则无需提供~/Desktop/Copy.cpp。只需给Copy.cpp,就足够了。