【问题标题】:fstream doesn't resolve pathfstream 不解析路径
【发布时间】:2015-01-21 20:55:00
【问题描述】:

我是 C++ 新手,正在尝试编写一个简单的函数,将字符串保存到文件中。 当我将完整路径传递给 fstream 时,该函数有效,但它不解析相对路径。

这是我的代码的相关部分

#include <iostream>
#include <fstream>

void writeToFile ()
{
    std::fstream fs;
    fs.open ("/home/blabla/Documents/test.txt", std::fstream::in | std::fstream::out | std::fstream::app);
    fs << " test content";

    fs.close();
}

这工作正常,但我想在执行我的程序的文件夹中创建文件,所以我尝试了这个

fs.open ("./test.txt", std::fstream::in | std::fstream::out | std::fstream::app);

我也试过

fs.open ("~/Documents/test.txt", std::fstream::in | std::fstream::out | std::fstream::app);

他们都没有创建新文件,我没有收到任何错误消息。

我发现这篇文章表明,我可以将相对路径传递给 fstream,但只提供 windows 示例。 How to use fstream objects with relative path?

我在 Linux Mint 上工作,目标环境是 debian。

感谢任何提示或建议, 迈克尔

【问题讨论】:

  • “在执行我的程序的文件夹中”是什么意思。你的意思是可执行文件的位置?
  • 这个~/Documents/test.txt 由shell 评估,而./test.txt 应该可以工作,如果你在同一个目录中运行你的程序。 "and i didn't get any error message"你永远不会得到,打开后你必须测试它:if(!fs) { std::cerr &lt;&lt; "Could not open file" &lt;&lt; std::endl; }

标签: c++ fstream


【解决方案1】:

相对路径确实适用于流。不过,您有两个有趣的案例。波浪号 (~) 是一些 shell 解释的特殊字符。我怀疑 fstream 没有做这种解释。至于"./test.txt" 的例子,我认为前面的评论是正确的——那个文件已经被创建了——它不是你所期望的。

【讨论】:

    【解决方案2】:

    你的程序

    #include <iostream>
    #include <fstream>
    
    void writeToFile () {
        std::fstream fs;
        fs.open ("./test.txt", std::fstream::in | std::fstream::out | std::fstream::app);
        fs << " test content";
    
        fs.close();
    }
    
    int main() {
        writeToFile();
    }
    

    我在Coliru 上工作得很好。

    ls 输出中可以看到,文件已创建

    a.out      << The executable program
    main.cpp   << The source
    test.txt   << The created text file
    

    cat至少转储文件的内容

     test content
    

    正如我在评论中提到的,~/Documents/test.txt 之类的路径由 shell 评估,而 ./test.txt 应该适用于打开现有文件,如果您在文件所在的同一目录中运行程序。

    “他们都没有创建新文件,我没有收到任何错误消息。”

    如果std::fstream::open() 因某种原因失败,您将永远不会收到任何类型的错误消息
    您必须在该调用之后检查流状态,例如

     if(!fs) { std::cerr << "Could not open file" << std::endl; }
    

    你可以例如无权在此目录中创建文件。

    另一种选择是使用std::fstream()std::basic_ios::exceptions() 函数,在流状态遇到错误条件时触发异常。

    【讨论】:

    • 感谢您的帮助。该文件确实已创建。在我的整个磁盘上进行的文件搜索显示,它不是在包含源文件的文件夹中创建的,而是在其他地方创建的。由于我使用了 ROS link、catkin_make 和 roslaunch 工具,因此该文件是在 /proc 文件夹中创建的。再次感谢您的努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多