【问题标题】:How do I output into a file in subdirectory?如何输出到子目录中的文件?
【发布时间】:2021-04-19 12:42:21
【问题描述】:

这不是重复的。我正在尝试将一些输出打印到子目录中的文件(在本例中为文件 /stuff/output_1.txt),但它似乎没有创建任何新文件。代码执行,但没有创建文件,也没有任何名为 /stuff 的子目录。这是我的代码:

#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

int main(void)
{
  int out = 1;
  stringstream fname;
  fstream f;
  fname << "./stuff/output" << "_" << out << ".txt";
  f.open(fname.str().c_str(), ios_base::out);
  f << "hello" << "\t";
  f << endl;
  f.close();
}

当我改用这条线时

fname << "output" << "_" << out << ".txt";

它会在当前目录中创建一个名为 output_1.txt 的文件,因此其余代码可以正常工作。出了什么问题?

我使用的是 macOS,所以“/”应该是正确的,而不是 Windows 上使用的“\”,不是吗?

【问题讨论】:

  • 你必须先创建子目录,使用mkdir。文件只能在已经存在的目录中创建。
  • 有没有叫 stuff 的目录?
  • 太棒了,非常感谢。我以为我已经尝试过了,但看起来我没有。 :)
  • 顺便说一句,因为 C++11 有一个需要 std::string 的重载,即你可以这样做 f.open(fname.str() , ios_base::out);

标签: c++ fstream stringstream


【解决方案1】:

没有创建文件,也没有创建任何子目录

您正在使用fstream,它希望路径存在。如果你引用了一个不存在的目录,那么它就会失败,因为你要么必须在运行程序之前创建目录,要么必须使用mkdir() 来创建它。

您可以通过f.is_open() 确认您的信息流是否可以打开。

f.open(fname.str().c_str(), ios_base::out);
if (f.is_open())
{
    f << "hello" << "\t";
    f << endl;
    f.close();
}
else
    std::cerr << "Unable to open " << fname;

【讨论】:

    【解决方案2】:

    也没有任何名为 ./stuff 的子目录

    您为什么希望fstream 为您创建子目录?你必须自己做。在我的机器上测试它时,我得到了相同的行为,简单的解决方案是执行mkdir stuff。之后,文件被正确创建。但我认为没有抛出运行时错误很奇怪。当子目录不存在时,fstream jsut 默默地什么都不做是不好的(尤其是对于初学者)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      相关资源
      最近更新 更多