在windows和linux下使用ifstream操作二进制.ply文件时的结果不同

时间:2017-06-27 18:45:30

标签: c++ linux windows ifstream

我正在尝试用c ++读取.ply文件并将几何信息保存在向量中(边界点为floats,边框三角形为int's。代码在Linux下运行但是当我尝试在Windows下使用它时,它并没有按预期运行。

以下是代码的精简版:

#include <iostream>
#include <iomanip>
#include <fstream>
#include <vector>

using namespace std;

string FilenamePLY;

int NumberBorderPoint = 1572866;
int BorderNumberTriangle = 3145728;

char numFloat;
char numInt;

int main(int argc, char** argv)
{
    FilenamePLY = "file_test.ply";

    ifstream fin(FilenamePLY.c_str());

    for (int i = 0; i < NumberBorderPoint; i++){
            fin.read(&numFloat, sizeof(float));
            for (int j = 0; j < 3; j++) {
                fin.read(&numFloat, sizeof(float));
            }

    }
    cout << fin.gcount() << endl;

    for (int i = 0; i<BorderNumberTriangle; i++){
            fin.read(&numInt, sizeof(int));
            for (int j = 0; j<3; j++)   {
                fin.read(&numInt, sizeof(int));
            }
    }
    cout << fin.gcount() << endl;
    return 0;
}

在Windows输出下编译和执行的代码:

0
0

而在Linux下,输出是:

4
4

我的感觉是,read函数没有获得正确的值来分隔二进制文件中的数字,但sizeof(float)sizeof(int)在Windows和Linux下都具有相同的值(4 )。

关于问题所在的任何想法?

感谢您的帮助,

2 个答案:

答案 0 :(得分:3)

尝试打开二进制读取文件:

ifstream fin(FilenamePLY.c_str(), std::ios::binary );

答案 1 :(得分:3)

以二进制模式打开文件并验证是否已打开文件。

您目前还正在将sizeof(float)的数据读入一个字符 - 它将在该点覆盖其他数据(numFloat,numInt)