【问题标题】:C++ binary output problemC++二进制输出问题
【发布时间】:2011-03-06 13:35:14
【问题描述】:

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

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

问候, 查尔斯。

【问题讨论】:

  • “不起作用”是什么意思?

标签: c++ binary outputstream


【解决方案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));
}

【讨论】:

  • 嗨,它仍然不起作用。我得到带有文本的输出,但没有得到二进制的输出。
  • 我现在把声明放在循环之前。每次迭代打开文件都会清除文件内容,除非你使用std::ios::app
  • 太疯狂了,还是不行。和往常一样,txt 部分仍然运行良好。
  • @Deadie:除了Elem的内容,还需要添加到ABC.dat吗?此外,对您的期望和获得的结果进行任何澄清都会有所帮助。
  • 不,我只需要 Elem 的内容。上面的代码部分在我命名为 write() 的函数中,它在更大函数的末尾被调用。这个函数在最后被正确调用,因此我得到了文本文件的预期输出。唯一的问题是二进制部分。我还在函数中放置了命令:ofstream Out_file("ABC.dat", std::ios::binary),而不是之前的构造函数,但我没有得到任何输出。
【解决方案2】:

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

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

【讨论】:

  • 嗨,它仍然不起作用。我得到带有文本的输出,但没有得到二进制的输出。更多细节在上面的讨论中。
【解决方案3】:

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

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

真诚的问候, 死神

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2021-09-18
    • 2011-10-20
    • 1970-01-01
    相关资源
    最近更新 更多