繁体   English   中英

C ++ ofstream指针无法写入磁盘

[英]c++ ofstream pointer fails to write to disk

我在写入ofstream指针时遇到麻烦,这非常令人困惑,因为我真的看不到任何丢失的东西。 请注意,这是该问题的后续内容: ofstream的C ++向量,如何写入一个特定元素

我的代码如下:

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个空文件。 有人知道这里可能有什么问题吗?

编辑:我进行了一些进一步的测试。 我让代码在没有退出(1)的情况下运行,直到完成为止,在所有文件上直到所有回调完成为止。 事实证明,有些文件不为空,而其他应包含数据的文件为空。

有足够的磁盘空间,而且我知道我的文件描述符比为此所需的要多。 为什么某些文件可以正确写入而另一些文件却不能正确写入任何解释?

我会尝试: (*filelist[5])<<"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的OS,您将需要/想要一个不同的文件名字符串。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM