C ++二进制输出问题

时间:2011-03-06 13:35:15

标签: c++ binary outputstream

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

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的值),而在其他情况下,它不起作用。有人可以告诉我有什么问题吗?让我发疯了。

此致 查尔斯。

3 个答案:

答案 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