在使用txt文档数据的时候,注意及时关闭,否则容易出错。下面的程序是实现txt数据转换成pcd数据的另一种方法,参考网上其他人修改的
#include<iostream>
#include<fstream>
#include <string>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
using namespace std;
int main()
{
struct lin
{
double a[3];
};
//////以下为计算txt文件中点的数量//////////
int n = 0;
int c = 0;
FILE *fp_txt;
fp_txt = fopen("C:/Users/can/Desktop/PCL test/txt2pcd/test.txt", "r");
if (fp_txt == NULL)
{
cout << "无法打开文件" << endl;
return 0;
}
do{
c = fgetc(fp_txt);
if (c == '\n')
{
++n;
}
} while (c != EOF);
std::cout << "Total points: " << n << std::endl;
//不关闭txt的话,下面的fscanf()函数接着往下读取,读不出来数据!!!!!!
fclose(fp_txt);
//关闭以后需要重新打开
fp_txt = fopen("C:/Users/can/Desktop/PCL test/txt2pcd/test.txt", "r");
lin * st_1 = new lin[n];
for(int i=0; i<n; ++i)
{
fscanf(fp_txt, "%lf %lf %lf", &st_1[i].a[0], &st_1[i].a[1], &st_1[i].a[2]);
}
std::cout<<"Read data is ok!"<<std::endl;
pcl::PointCloud<pcl::PointXYZ> cloud;
// Fill in the cloud data
cloud.width = n;
cloud.height = 1;
cloud.is_dense = false;
cloud.points.resize (cloud.width * cloud.height);
for (size_t i = 0; i < cloud.points.size (); ++i)
{
cloud.points[i].x = st_1[i].a[0];
cloud.points[i].y = st_1[i].a[1];
cloud.points[i].z = st_1[i].a[2];
}
pcl::io::savePCDFileASCII ("C:/Users/can/Desktop/PCL test/txt2pcd/txt2pcd.pcd", cloud);
std::cerr << "Saved " << cloud.points.size () << " data points to txt2pcd.pcd." << std::endl;
for (size_t i = 0; i < cloud.points.size (); ++i)
std::cerr << " " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;
delete[] st_1;
system("pause");
return 0;
}