【问题标题】:How to use fstream objects with relative path?如何使用具有相对路径的 fstream 对象?
【发布时间】:2011-12-25 12:25:05
【问题描述】:

我是否总是必须为从 std::fstream 类实例化的对象指定绝对路径?换句话说,有没有办法只指定它们的相对路径,例如项目路径?

【问题讨论】:

    标签: c++ fstream relative-path


    【解决方案1】:

    您也可以使用相对路径。但它们与您调用可执行文件的环境有关。

    这取决于操作系统,但所有主要系统的行为或多或少都与 AFAIK 相同。

    Windows 示例:

    // File structure:
    c:\folder\myprogram.exe
    c:\myfile.txt
    
    // Calling command from folder
    c:\folder > myprogram.exe
    

    在上面的示例中,您可以使用“c:/myfile.txt”或“../myfile.txt”访问 myfile.txt。如果从根 c:\ 调用 myprogram.exe,则只有绝对路径可以工作,而“myfile.txt”可以工作。

    正如 Rob Kennedy 在 cmets 中所说,关于 fstream 的路径确实没有什么特别之处。但这里是一个使用相对路径的代码示例:

    #include <fstream>
    int main() {
        std::ifstream ifs("../myfile.txt");
        ... // Do something sensible with the file
    }
    

    【讨论】:

    • 怎么做what,@User?如果你有一个带有相对路径的字符串,你可以将它传递给fstream::fstreamfstream::open,就像你传递一个带有绝对路径的字符串一样。
    【解决方案2】:

    如果您有一个从 C:\Users\Me 运行的 .exe 文件 你想写一个文件到C:\Users\Me\You\text.txt, 那么你需要做的就是添加当前路径运算符.,所以:

    std::ifstream ifs(".\\you\\myfile.txt");
    

    会起作用

    【讨论】:

    • 我从您的评论中得到的提示是,所有项目都有一个默认根目录$(SolutionDir),这是在项目属性配置页面中定义的宏。我假设所有相对路径都从 $(SolutionDir) 开始。
    • 出于某种原因,这是答案,我不知道为什么。我使用.// 让它在Linux 上工作,但我期待../ 工作。
    【解决方案3】:

    您可以使用相对路径。它们被视为与任何其他文件操作的相对路径相同,例如fopen;在这方面,fstream 没有什么特别之处。

    具体如何处理它们是实现定义的;它们通常会相对于您进程的当前工作目录进行解释,该目录不一定与您的程序的可执行文件所在的目录相同。某些操作系统还可能提供由 all 共享的单个工作目录线程,因此如果一个线程更改工作目录的同时另一个线程尝试使用相对路径,您可能会得到意想不到的结果。

    【讨论】:

      【解决方案4】:

      行为是特定于操作系统的。因此,处理这个恕我直言的最好方法是让它成为别人的问题。从用户那里读取要作为字符串打开的文件的路径(例如:命令行参数、配置文件、环境变量等),然后将该字符串直接传递给 fstream 的构造函数。记录您的程序的行为方式。

      我在这里写了更多关于路径操作的文章:https://stackoverflow.com/a/40980510/2345997

      【讨论】:

        【解决方案5】:

        假设您的项目目录下有一个src 文件夹,而src 文件夹包含另一个tmp_folder 文件夹,其中包含一个名为readMe.txt 的txt 文件。这样txt文件就可以这样读取了

        std::ifstream fin("../src/tmp_folder/readMe.txt");
        

        【讨论】:

          【解决方案6】:

          您可以指定相对于当前目录的路径。在 Windows 上,您可以调用 GetCurrentDirectory 来检索 当前目录 或调用 SetCurrentDirectory 来设置 当前目录。还有一些 CRT 函数可用。

          【讨论】:

            【解决方案7】:

            在 linux 上也可以:

            // main.cpp
            int main() {
                ifstream myFile("../Folder/readme.txt");
                // ...
            }
            

            假设文件夹结构是这样的:

            /usr/Douments/dev/MyProject/main.cpp /usr/Documents/dev/MyProject/Folder/readme.txt

            【讨论】:

              猜你喜欢
              • 2015-03-26
              • 1970-01-01
              • 2014-03-07
              • 1970-01-01
              • 1970-01-01
              • 2013-04-10
              • 1970-01-01
              • 2021-08-07
              • 1970-01-01
              相关资源
              最近更新 更多