isstringstream對象可以綁定一行字符串,然後以空格爲分隔符把該行分割開。
添加頭文件:#include
工程實例:
比如讀取文件:data.txt
L 0 0 1477010443349642 0 0 0 0
R 0 0 0 1477010443349642 0 0 0 0
工程實現:
頭文件定義數據類型:
class MeasurementPackage {
public:
long long timestamp_;
enum SensorType{
LASER,
RADAR
} sensor_type_;
Eigen::VectorXd raw_measurements_;
};
class GroundTruthPackage {
public:
long timestamp_;
enum SensorType{
LASER,
RADAR
} sensor_type_;
Eigen::VectorXd gt_values_;
};
std::string input_file_name = "..data.txt";
// 打開數據,若失敗則輸出失敗信息,返回-1,並終止程序
// Open file. if failed return -1 & end program
std::ifstream input_file(input_file_name.c_str(), std::ifstream::in);
if (!input_file.is_open()) {
std::cout << "Failed to open file named : " << input_file_name << std::endl;
return -1;
}
std::vector<MeasurementPackage> measurement_pack_list;
std::vector<GroundTruthPackage> groundtruth_pack_list;
std::string line;
while (getline(input_file, line))
{
std::string sensor_type;
MeasurementPackage meas_package;
GroundTruthPackage gt_package;
std::istringstream iss(line);
long long timestamp;
// 讀取當前行的第一個元素,L代表Lidar數據,R代表Radar數據
// Reads first element from the current line. L stands for Lidar. R stands for Radar.
iss >> sensor_type;
if (sensor_type.compare("L") == 0) {
// 激光雷達數據 Lidar data
// 該行第二個元素爲測量值x,第三個元素爲測量值y,第四個元素爲時間戳(納秒)
// 2nd element is x; 3rd element is y; 4th element is timestamp(nano second)
meas_package.sensor_type_ = MeasurementPackage::LASER;
meas_package.raw_measurements_ = Eigen::VectorXd(2);
float x;
float y;
iss >> x;
iss >> y;
meas_package.raw_measurements_ << x, y;
iss >> timestamp;
meas_package.timestamp_ = timestamp;
measurement_pack_list.push_back(meas_package);
} else if (sensor_type.compare("R") == 0) {
// 毫米波雷達數據 Radar data
// 該行第二個元素爲距離pho,第三個元素爲角度phi,第四個元素爲徑向速度pho_dot,第五個元素爲時間戳(納秒)
// 2nd element is pho; 3rd element is phi; 4th element is pho_dot; 5th element is timestamp(nano second)
meas_package.sensor_type_ = MeasurementPackage::RADAR;
meas_package.raw_measurements_ = Eigen::VectorXd(3);
float rho;
float phi;
float rho_dot;
iss >> rho;
iss >> phi;
iss >> rho_dot;
meas_package.raw_measurements_ << rho, phi, rho_dot;
iss >> timestamp;
meas_package.timestamp_ = timestamp;
measurement_pack_list.push_back(meas_package);
}
// 當前行的最後四個元素分別是x方向上的距離真值,y方向上的距離真值,x方向上的速度真值,y方向上的速度真值
// read ground truth data to compare later
float x_gt;
float y_gt;
float vx_gt;
float vy_gt;
iss >> x_gt;
iss >> y_gt;
iss >> vx_gt;
iss >> vy_gt;
gt_package.gt_values_ = Eigen::VectorXd(4);
gt_package.gt_values_ << x_gt, y_gt, vx_gt, vy_gt;
groundtruth_pack_list.push_back(gt_package);
}