C ++, как вывести Ply файл в двоичном формате

Я пытаюсь создать двоичный файл PLY со следующим заголовком:

ply
format binary_little_endian 1.0
element vertex 43000
property float x
property float y
property float z
property float nx
property float ny
property float nz
property uchar red
property uchar green
property uchar blue
end_header

У меня есть следующие перегруженные функции для записи в двоичном виде (проверено на другом примере):

inline void write_fbin(std::ofstream &out, float val) {
out.write(reinterpret_cast<char*>(&val), sizeof(float));
}inline void write_fbin(std::ofstream &out, unsigned char val) {
out.write(reinterpret_cast<char*>(&val), sizeof(unsigned char));
}

Я пишу информацию о вершинах следующим образом:

write_fbin(ofstr, static_cast<float>(point.x));
write_fbin(ofstr, static_cast<float>(point.y));
write_fbin(ofstr, static_cast<float>(point.z));
write_fbin(ofstr, static_cast<float>(point.n_x));
write_fbin(ofstr, static_cast<float>(point.n_y));
write_fbin(ofstr, static_cast<float>(point.n_z));
write_fbin(ofstr, static_cast<unsigned char>(point.r));
write_fbin(ofstr, static_cast<unsigned char>(point.g));
write_fbin(ofstr, static_cast<unsigned char>(point.b));

где point это структура типа

struct DensePoint {
float x, y, z;
float n_x, n_y, n_z;
unsigned char r, g, b;
};

Это не работает и создает неверный файл сгиба. Тем не менее, если я использую тот же код (изменение заголовка) для создания версии ASCII,

ofstr
<< point.x << ' '
<< point.y << ' '
<< point.z << ' '
<< point.n_x << ' '
<< point.n_y << ' '
<< point.n_z << ' '
<< static_cast<int>(point.r) << ' '
<< static_cast<int>(point.g) << ' '
<< static_cast<int>(point.b) <<
'\n';

это работает отлично. Что может быть не так?

Может быть, мне нужно ввести новую строку в конце каждой вершины в двоичном формате?

1

Решение

При записи / чтении двоичных данных в / из файла, который, кажется, не соответствует ожидаемому формату, существует вероятность того, что на уровне ОС существует преобразование символов, которое заменяет определенные комбинации байтов другими (например, 0x0C становится 0x0C 0x0A).

Скорее всего, вы открыли файл в текстовом режиме (по умолчанию для потока C ++), когда он должен был быть двоичным, чтобы поведение операционной системы было нейтральным.

2

Другие решения


По вопросам рекламы [email protected]