C++ c++;ofstream指针无法写入磁盘
我在写流指针的时候遇到了麻烦,这让我很困惑,因为我真的看不到任何遗漏的东西了。注意,这是这个问题的后续: 我的代码如下:C++ c++;ofstream指针无法写入磁盘,c++,pointers,flush,ofstream,C++,Pointers,Flush,Ofstream,我在写流指针的时候遇到了麻烦,这让我很困惑,因为我真的看不到任何遗漏的东西了。注意,这是这个问题的后续: 我的代码如下: 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_
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);
}
std::向量文件列表;
void main()
{
对于(int ii=0;ii我会尝试:(*filelist[5])在调用exit
和filelist[5]->close()之前尝试关闭文件
。您中止了一个打开文件的进程,这意味着您的写入可能没有进入操作系统缓冲区,或者在进程退出时被丢弃。您也可以删除退出调用,这可能会解决问题。中止进程的IO结果很难确定,因此最好尝试避免使用活动IO中止,或者假设任何活动IO在中止时都会失败。为什么std::vector
而不是simplestd::vector
?@LihO您无法复制ofstream,因此无法直接执行ofstream的向量。使用共享的ptr而不是原始指针可以节省手动删除资源的时间。还有其他方法可以降低成本,但对于一个包含10项的向量其实并不重要。所以我使用exit提前结束执行,是否应该使用一些东西来代替exit?我改为上面的建议,但似乎没有改变代码的行为。不幸的是,仍然没有编写任何内容。@user788171您没有提前结束执行。您已经结束了已经有了main()
。在我设计的示例中,我没有输入exit()之后的其余代码,其目的是为了这个测试的目的而退出执行。当我推回ofstream时是否需要新的吗?@user788171:当您使用共享的ptr时,它不应该是。我只是将它用作获取独立代码的简单方法。所以我尝试调用close()这并没有改变任何事情。不幸的是,这是在回调函数中,我不确定有什么方法可以优雅地退出该函数。@user788171-Hmm,除了在退出之前关闭文件之外,您发布的代码中似乎没有任何东西表明您为什么会有这种行为。您所访问的文件是否有特殊权限重新写入?它们是在挂载目录中还是在afs之类的共享系统下?
#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();
}
}