我在写入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个空文件。有人知道这里可能有什么问题吗?
编辑:我进行了一些进一步的测试。我让代码在没有退出(1)的情况下运行,直到完成所有文件,直到所有回调都完成。事实证明,有些文件不是空的,而其他应该有数据的文件是空的。有足够的磁盘空间,我知道我有更多的文件描述符。有关为什么某些文件可以正确写入而其他文件没有正确写入的任何解释?
答案 0 :(得分: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操作系统,您需要/想要一个不同的文件名字符串。
答案 1 :(得分:0)
在使用exit
致电filelist[5]->close();
之前,请尝试关闭该文件。您已使用打开的文件中止了一个进程,这意味着您的写入可能没有进入OS缓冲区,或者在进程退出时被丢弃。你也可以删除它可能解决问题的退出调用。在中止的进程上IO的结果很难确定,因此最好尝试避免使用活动IO中止或假设任何活动IO在中止时将失败。