Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Fstream - Fatal编程技术网

C++ 在C++;

C++ 在C++;,c++,fstream,C++,Fstream,我想将坐标向量中的数据写入二进制.stl三维几何文件 我需要一个80位的头,24位的三角形。 每个三角形应该由3个点和一条法线定义,每个点和法线的坐标值为32位。此外,每个三角形可能都有一个属性,我想保留为空。(见附件) 我想我仍然对字符和二进制模式有误解 最终生成的文件与我的原始文件大小相同,但图形程序无法读取,因此仍然需要存在逻辑错误 我的点坐标在转换为char*之前是双值的,这样可以吗 我的代码: void write_stl(std::string filename, std::vec

我想将坐标向量中的数据写入二进制.stl三维几何文件

我需要一个80位的头,24位的三角形。 每个三角形应该由3个点和一条法线定义,每个点和法线的坐标值为32位。此外,每个三角形可能都有一个属性,我想保留为空。(见附件)

我想我仍然对字符和二进制模式有误解

最终生成的文件与我的原始文件大小相同,但图形程序无法读取,因此仍然需要存在逻辑错误

我的点坐标在转换为char*之前是双值的,这样可以吗

我的代码:

void write_stl(std::string filename, std::vector<tri> triangles){

//binary file
std::string header_info = "solid " + filename + "-output";
char head[80];
std::strncpy(head,header_info.c_str(),sizeof(head)-1);
char attribute[2] = "0";
unsigned long nTriLong = triangles.size() ;

std::ofstream myfile;

myfile.open((Filename + "-out.stl").c_str(),  std::ios::out | std::ios::binary);
myfile.write(head,sizeof(head));
myfile.write((char*)&nTriLong,4);

    //write down every triangle
for (std::vector<tri>::iterator it = triangles.begin(); it!=triangles.end(); it++){
    //normal vector coordinates

    myfile.write((char*)&it->m_n.m_x, 4);
    myfile.write((char*)&it->m_n.m_y, 4);
    myfile.write((char*)&it->m_n.m_z, 4);

    //p1 coordinates
    myfile.write((char*)&it->m_p1.m_x, 4);
    myfile.write((char*)&it->m_p1.m_y, 4);
    myfile.write((char*)&it->m_p1.m_z, 4);

    //p2 coordinates
    myfile.write((char*)&it->m_p2.m_x, 4);
    myfile.write((char*)&it->m_p2.m_y, 4);
    myfile.write((char*)&it->m_p2.m_z, 4);

    //p3 coordinates
    myfile.write((char*)&it->m_p3.m_x, 4);
    myfile.write((char*)&it->m_p3.m_y, 4);
    myfile.write((char*)&it->m_p3.m_z, 4);

    myfile.write(attribute,2);
}

myfile.close();
void write\u stl(std::字符串文件名,std::向量三角形){
//二进制文件
std::string header_info=“solid”+filename+“-output”;
炭头[80];
std::strncpy(head,header_info.c_str(),sizeof(head)-1);
字符属性[2]=“0”;
unsigned long nTriLong=triangles.size();
std::流myfile;
myfile.open((Filename+“-out.stl”).c_str(),std::ios::out | std::ios::binary);
write(head,sizeof(head));
write((char*)&nTriLong,4);
//写下每个三角形
对于(std::vector::iterator it=triangles.begin();it!=triangles.end();it++){
//法向量坐标
write((char*)&it->m_n.m_x,4);
write((char*)&it->m_n.m_y,4);
write((char*)&it->m_n.m_z,4);
//p1坐标
write((char*)&it->m_p1.m_x,4);
write((char*)&it->m_p1.m_y,4);
write((char*)&it->m_p1.m_z,4);
//p2坐标
write((char*)&it->m_p2.m_x,4);
write((char*)&it->m_p2.m_y,4);
write((char*)&it->m_p2.m_z,4);
//p3坐标
write((char*)&it->m_p3.m_x,4);
write((char*)&it->m_p3.m_y,4);
write((char*)&it->m_p3.m_z,4);
write(属性,2);
}
myfile.close();
}


其中,
tri
只是一个三角形的结构,包含3个点和法线作为“3D向量”(即具有x、y、z、值的结构).

write()的size参数是以字节为单位的大小,而不是以位为单位的大小。当你应该通过4时,你通过了一个
float

这就是为什么建议使用
sizeof(variable\u name)
的方法谢谢!我懂了。。。实际上,我没有使用的大小,因为我希望大小比实际需要填写的空间小。如果我不使用确切的字节,文件将无法正确读取