C ++ / Qt:无效的STL文件 - 无法读取前6个字节

时间:2014-11-12 11:13:48

标签: c++ qt stl

std::string fname = "cube.stl";
FILE *inf = std::fopen(fname.c_str(), "rb");
if (inf == NULL) {
    //throw std::runtime_error(std::string("Cannot open file ") + fname);
    qglColor(Qt::black);
    this->renderText(10, 10, "Cannot open file ");
}
char buffer[6];
size_t bytes_read = fread(buffer, 1, 6, inf);//copy file to buffer
QString bytes_read_diaplay = QString::number(bytes_read);
qglColor(Qt::black);
this->renderText(10, 300, bytes_read_diaplay);

if (bytes_read != 6) {
    qglColor(Qt::black);
    this->renderText(10, 10, "Invalid STL file - could not read first 6 bytes.");
}

std::rewind(inf);

if (0 == std::memcmp(buffer, "solid ", 6)) {
    //read_ascii_file(inf);
    qglColor(Qt::black);
    this->renderText(10, 30, "read_ascii_file");
} else {
    //read_binary_file(inf);
    qglColor(Qt::black);
    this->renderText(10, 30, "read_binary_file");
    char buffer[80];
    size_t num_read = fread(buffer, 1, 80, inf);
    if (num_read != 80) {
        qglColor(Qt::black);
        this->renderText(10, 50, "Invalid binary STL file - could not read 80 byte header.");
    } 
    std::memcpy(header, buffer, 80);

    unsigned int num_tris = 0;
    num_read = std::fread(&num_tris, sizeof(unsigned int), 1, inf);
    if (num_read != 1) {

        qglColor(Qt::black);
        this->renderText(10, 70, "Invalid binary STL file - could not read number of triangles from binary STL file.");
    }


}
std::fclose(inf);

我得到的bytes_read是4,所以我得到了:

  

无效的STL文件 - 无法读取前6个字节。

     

read_binary_file

     

无效的二进制STL文件 - 无法读取80字节标题。

     

无效的二进制STL文件 - 无法读取二进制STL文件中的三角形数量。

" cube.stl"是.stl文件,但为什么会这样显示?哪里错了?如何在cube.stl中获取顶点坐标? 有我的.stl文件:http://www.mediafire.com/download/hnnw444anih201n/cube.stl


解决

检查后检查并检查。最后,我找到了自己的方式。 D ***它,错误很简单。我更改了std :: string fname =" cube.stl&#34 ;;的路径(cube.stl到D:/.../ cube.stl)。太棒了。 RUN。

1 个答案:

答案 0 :(得分:0)

您似乎对Ascii和Binary文件之间的区别感到困惑。

fopen的“rb”标志将作为二进制文件打开。 cube.stl是二进制文件吗? .stl文件可以是Binary或Ascii。

此外,您如何验证文件大小?您期望6 char in或80字节的二进制。这些数字来自哪里?

简而言之,你的问题是:

  • 是cube.stl Ascii?
  • 标题的大小是多少?
  • .stl文件中二进制数据的格式是什么?