【问题标题】:c++ ofstream pointer fails to write to diskc++ ofstream指针无法写入磁盘
【发布时间】:2013-04-01 18:19:55
【问题描述】:

我在写入 ofstream 指针时遇到问题,这非常令人困惑,因为我真的看不到任何丢失的东西了。请注意,这是此问题的后续内容: C++ vector of ofstream, how to write to one particular element

我的代码如下:

std::vector<shared_ptr<ofstream>> filelist;

void main()
{
  for(int ii=0;ii<10;ii++)
  {
     string filename = "/dev/shm/table_"+int2string(ii)+".csv";
     filelist.push_back(make_shared<ofstream>(filename.c_str()));
  }

  *filelist[5]<<"some string"<<endl;
  filelist[5]->flush();
  exit(1);

}

这不会向输出文件写入任何内容,但会创建 10 个空文件。有人知道这里可能出了什么问题吗?

编辑:我进行了一些进一步的测试。我让代码在没有 exit(1) 的情况下运行直到完成,在所有文件上运行,直到所有回调完成。原来有些文件不是空的,而其他应该有数据的却是空的。

有足够的磁盘空间,而且我知道我的文件描述符超出了所需的数量。有什么解释为什么有些文件可以正确写入,而有些则不能?

【问题讨论】:

  • 为什么是std::vector&lt;shared_ptr&lt;ofstream&gt;&gt; 而不是简单的std::vector&lt;std::ofstream&gt;
  • @LihO 你不能复制一个 ofstream 所以你不能直接做一个 ofstreams 的向量。使用 shared_ptr 而不是原始指针可以节省您手动删除资源的时间。还有其他成本惩罚较低的方法,但对于包含 10 个项目的向量,这并不重要。

标签: c++ pointers flush ofstream


【解决方案1】:

我会试试:(*filelist[5])&lt;&lt;"some string\n";

不过,我猜您可能打算在循环中写入文件——照原样,您只写入一个文件。

哦,在 C++ 中,您不想使用 exit

编辑:这是一个快速(经过测试)的独立演示:

#include <fstream>
#include <string>
#include <vector>

std::vector<std::ofstream *> filelist;

int main() {
  for(int ii=0;ii<3;ii++)
  {
    char *names[] = {"one", "two", "three"};
     std::string filename = "c:\\trash_";
     filename += names[ii];
     filename += ".txt";
     filelist.push_back(new std::ofstream(filename.c_str()));
  }

  for (int i=0; i<filelist.size(); i++) {
    (*filelist[i])<<"some string\n";
    filelist[i]->close();
  }
}

但是请注意,它生成的文件名是针对 Windows 的,而原始文件名(显然)是针对类似 Unix 的。对于类 Unix 操作系统,您需要/想要一个不同的文件名字符串。

【讨论】:

  • 所以我使用exit来提前结束执行,有什么应该用来代替exit的吗?我改变了上面的建议,不幸的是,它似乎并没有改变代码的行为,仍然没有写任何东西。
  • @user788171 不过,您并没有提前结束执行。你已经在main() 的末尾了。
  • 好吧,在我的人为示例中,我没有放入 exit() 之后的其余代码,目的是为了进行此测试而退出执行。
  • push_back ofstream 是否需要新的?
  • @user788171:当您使用 shared_ptr 时,它不应该。我只是将它用作获取独立代码的简单方法。
【解决方案2】:

在使用filelist[5]-&gt;close(); 调用exit 之前尝试关闭文件。您已经用打开的文件中止了一个进程,这意味着您的写入可能没有进入操作系统缓冲区或在进程退出时被丢弃。您还可以删除退出调用,它可能会解决问题。 IO 对中止进程的结果很难确定,因此最好尝试避免使用活动 IO 进行中止,或者假设任何活动 IO 在中止时都会失败。

【讨论】:

  • 所以我确实尝试调用 close() 并没有改变任何东西。不幸的是,这是在回调函数中,我不确定有什么方法可以优雅地退出。
  • @user788171 嗯,除了在退出前关闭文件之外,您发布的代码中似乎没有任何内容表明您为什么会出现这种行为。您正在编写的文件是否有特殊权限?它们是在挂载目录中还是在 afs 之类的共享系统下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 2011-05-20
相关资源
最近更新 更多