Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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_Binaryfiles - Fatal编程技术网

C++ 在c+中写入二进制文件时如何设置精度+;?

C++ 在c+中写入二进制文件时如何设置精度+;?,c++,fstream,binaryfiles,C++,Fstream,Binaryfiles,我需要将.pcd格式的数据转换成.bin格式(数据是激光雷达点云)。因此,我试图以精确的行对齐顺序写入数据。但我完全可以设定精度。转换完成后,我读取了.bin文件。数据仍然不是预定义的精度格式。 代码如下: #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> using namespace std; int mai

我需要将.pcd格式的数据转换成.bin格式(数据是激光雷达点云)。因此,我试图以精确的行对齐顺序写入数据。但我完全可以设定精度。转换完成后,我读取了.bin文件。数据仍然不是预定义的精度格式。 代码如下:

#include <iostream>           
#include <pcl/io/pcd_io.h>      
#include <pcl/point_types.h>     
using namespace std;


int main(){
    std::string bin_path = "/home/dummy/data1/pcd_bin/bin/";
    std::string out_file = bin_path+"100.bin";
    pcl::PointCloud<pcl::PointXYZ> cloud;
    for (int v=0; v<1000; ++v)
    {
        pcl::PointXYZ newPoint;
        newPoint.x = (rand() * 100.0) / RAND_MAX;
        newPoint.y = (rand() * 100.0) / RAND_MAX;
        newPoint.z = (rand() * 100.0) / RAND_MAX;
        //newPoint.intensity = (rand() * 100.0) / RAND_MAX;
        cloud.points.push_back(newPoint);
    }
       //Create & write .bin file
      ofstream  bin_file(out_file.c_str(),ios::out|ios::binary|ios::app);
      if(!bin_file.good()) cout<<"Couldn't open "<<out_file<<endl;  


      for (size_t i = 0; i < cloud.points.size (); ++i)
      {
        bin_file<<std::setprecision(5);
        bin_file.write((char*)&cloud.points[i].x,3*sizeof(float)); 
       // bin_file.write((char*)&cloud.points[i].intensity,sizeof(float));
        //cout<<    cloud->points[i]<<endl;
      }
}
PS:预期的格式值为空。我用python读取二进制文件,并将值保存在.txt文件中以供可视化

PS1:需要pcl库来重现结果

PS2:我有其他二进制文件,用C++编写,精度很高,所以我用Python读取这些文件,类型为FLUAT32。


提前感谢

正如@someprogrammer dude在上述评论中所建议的那样,只有当我们需要精确地表示二进制文件中的值时,我们才可以使用std::setprecision。为了首先设置精度,我们需要将值以精度存储到.txt文件,并将值从.txt存储到.bin文件。

在写入原始二进制数据时,您不需要(或者实际上应该)设置精度。仅在向用户显示数据时设置精度。此外,您似乎遇到的问题是,转换文件中二进制数据的程序没有使用与文件中实际存储的值相同的浮点格式。请尝试创建一个包含编写数据的程序(如果必须的话,请创建硬代码值)和读取并显示文件的Python脚本的脚本。说真的,您是在用随机数测试程序吗?您需要使用类似于写入2行0的内容进行测试。检查文件大小并尝试在其他程序中读取。一旦成功,请在两行上尝试类似于1、0、0的内容。这样,您可以更轻松地分析实际文件内容。@Phil1970,请参阅代码,二进制文件是用float类型编写的。这不仅仅是一种假设。有关C++中浮点的更多信息,仅在使用<代码>作为文本时使用。因为编写原始二进制数据,不能设置精度。精确是一种纯粹的表象。如果要对文件中存储的值进行四舍五入,则必须在写入之前对每个数字进行显式四舍五入。不,不需要文本文件往返。在应用程序中舍入您的值,如果这是您想要做的。@swithwings,我尝试了您的方法,它也很有效,谢谢
 raw_lidar_o_crop = np.fromfile(100.bin, dtype=np.float32).reshape((-1, 4))
    print("ouster new ")
    with open("ouster_new_intensity2.txt", "w") as text_file:
        for i in range(len(raw_lidar_o_crop)):
           print(f"ouster points cropped : {raw_lidar_o_crop[i]}", file=text_file)