有人可以告诉我这段代码有什么问题吗?
Out_file = new ofstream("ABC.dat", std::ios::binary);
for (int i = 0; i < Elem->entries(); i++)
{
co_ord_X = (*Elem)[i]->Getx(); co_ord_Y = (*Elem)[i]->Gety(); co_ord_Z = (*Elem)[i]->Getz();
Intensity = (*Elem)[i]->GetInt();
ofstream out_txt( "z2_out.txt",ios::app);
out_txt<<co_ord_X<<" "<<co_ord_Y<<" "<<co_ord_Z <<" "<<Intensity<<endl;
out_txt.close();
Out_file->write(reinterpret_cast<char*>(&co_ord_X), sizeof(double));
Out_file->write(reinterpret_cast<char*>(&co_ord_Y), sizeof(double));
Out_file->write(reinterpret_cast<char*>(&co_ord_Z), sizeof(double));
Out_file->write(reinterpret_cast<char*>(&Intensity), sizeof(double));
}
变量Elem是指向数组的指针。 co_ord_X,co_ord_y,co_ord_y和Intensity的类型为double。我能够输出文本文件(“out_txt”),但是我在编写二进制文件时遇到了问题(“Out_file”)。奇怪的是,在某些情况下它可以工作(取决于变量co_ord_X,co_ord_y,co_ord_y和Intensity的值),而在其他情况下,它不起作用。有人可以告诉我有什么问题吗?让我发疯了。
此致 查尔斯。
答案 0 :(得分:1)
您正在动态分配您的ofstream
对象,该对象在您的工作完成后不会关闭。在循环的第二次迭代中,您尝试打开一个新文件,文件打开失败,但您也没有检查。
要解决此问题,请在循环之前将堆栈对象用于文件流。
ofstream out_txt( "z2_out.txt");
ofstream Out_file("ABC.dat", std::ios::binary);
for (int i = 0; i < Elem->entries(); i++)
{
co_ord_X = (*Elem)[i]->Getx(); co_ord_Y = (*Elem)[i]->Gety(); co_ord_Z = (*Elem)[i]->Getz();
Intensity = (*Elem)[i]->GetInt();
out_txt<<co_ord_X<<" "<<co_ord_Y<<" "<<co_ord_Z <<" "<<Intensity<<endl;
Out_file.write(reinterpret_cast<char*>(&co_ord_X), sizeof(double));
Out_file.write(reinterpret_cast<char*>(&co_ord_Y), sizeof(double));
Out_file.write(reinterpret_cast<char*>(&co_ord_Z), sizeof(double));
Out_file.write(reinterpret_cast<char*>(&Intensity), sizeof(double));
}
答案 1 :(得分:0)
每次迭代都会创建两个输出流。您正在使用ios :: app进行文本流,这意味着数据将被添加到文件末尾,因此在这种情况下它可以正常工作,正如预期的那样。但是二进制流是用这个标志创建的,所以它每次都会截断文件,因为你没有关闭流并为同一个文件创建一个新的文件,所以可以发生任何事情。
要修复此问题,只需在循环之前定义输出流,然后在堆栈上创建它,或者在将其用作指针后将其删除。
答案 2 :(得分:0)
现在我真的觉得自己像个白痴。在阅读编程书籍以便总是删除指针之后,我从不这样做,因为我根本没有遇到任何问题。好吧,这个花了我一个多星期的时间来寻求帮助,几个小时才终于明白了。我基本上使用了完全相同的代码,但最后删除了“Out_file”指针,并得到了我期待的输出。
对于像我这样的所有新手,实施你所读到的!对于所有投入时间帮助我解决问题的人,请接受我的诚挚谢意和道歉。
真诚的问候, Deadie