Проблема двоичного вывода в C ++ - PullRequest
0 голосов
/ 06 марта 2011

Может кто-нибудь сказать мне, что не так с этим кодом?

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 ]

1 голос
/ 06 марта 2011

Вы динамически распределяете свой объект 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));
}
0 голосов
/ 06 марта 2011

Теперь я действительно чувствую себя идиотом.После чтения в книгах по программированию, чтобы всегда удалять указатели, я никогда не делаю этого, потому что у меня просто не было никаких проблем с ними.Ну, этот занял у меня больше недели, чтобы попросить о помощи, и несколько часов, чтобы наконец понять это.Я в основном использовал ТОЧНО тот же код, но в конце удалил указатель «Out_file» и получил ожидаемый результат.

Для всех новичков, как я, реализуй то, что читаешь!За всех ребят, которые потратили свое время, чтобы помочь мне с этой проблемой, примите мою искреннюю благодарность и извинения.

С уважением, Deadie

0 голосов
/ 06 марта 2011

Оба выходных потока создаются на каждой итерации.Вы используете ios :: app для текстового потока, что означает, что данные будут добавлены в конец файла, поэтому в этом случае он работает нормально, как и ожидалось.Но двоичный поток создается без этого флага, поэтому он усекает файл каждый раз, и поскольку вы не закрываете поток и не создаете новый для того же файла, может произойти все что угодно.

КомуИсправьте эту проблему, просто определите выходной поток перед циклом и создайте его в стеке или удалите после, если вы используете его в качестве указателя.

...