0

有人能告诉我这段代码有什么问题吗?

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 是双精度类型。我能够输出文本文件(“out_txt”),但是我在编写二进制文件(“Out_file”)时遇到问题。奇怪的是,在某些情况下它会起作用(取决于变量 co_ord_X、co_ord_y、co_ord_y 和 Intensity 的值),而在其他情况下则不起作用。有人可以告诉我有什么问题吗?快把我逼疯了。

问候,查尔斯。

4

3 回答 3

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));
}
于 2011-03-06T13:40:37.760 回答
0

现在我真的觉得自己像个白痴。在阅读了总是删除指针的编程书籍之后,我从来没有这样做过,因为我对它们没有任何问题。好吧,这个我花了一个多星期的时间寻求帮助,花了几个小时才终于弄清楚。我基本上使用了完全相同的代码,但最后删除了“Out_file”指针,并得到了我期望的输出。

对于所有像我这样的新手,实施你所读的!对于所有投入时间帮助我解决问题的人,请接受我真诚的感谢和道歉。

真诚的问候,迪迪

于 2011-03-06T16:23:19.913 回答
0

每次迭代都会创建两个输出流。您正在将 ios::app 用于文本流,这意味着数据将被添加到文件末尾,因此在这种情况下它可以正常工作,正如预期的那样。但是二进制流是在没有这个标志的情况下创建的,所以它每次都会截断文件,而且由于你没有关闭流并为同一个文件创建一个新的流,所以任何事情都可能发生。

要解决此问题,只需在循环之前定义输出流,然后在堆栈上创建它,如果将其用作指针,则在之后将其删除。

于 2011-03-06T13:54:06.483 回答