boost库中的boost::algorithm库中的split字符串分割函数,配合boost::lexical_cast类型转换函数来处理固定格式的文本非常方便:
特别是在处理.csv文件时尤其方便,但在编译程序时记得要预定义宏_SCL_SECURE_NO_WARNINGS:否则无法通过编译。
比较下面这个文本:
其中的每个数据字段之间都是使用空格分隔的:
现在我只想读取其中的数据,并去掉第一行和第一列:
示例代码如下:
测试结果:
可以看到最后一行的数据也是正确的。
特别是在处理.csv文件时尤其方便,但在编译程序时记得要预定义宏_SCL_SECURE_NO_WARNINGS:否则无法通过编译。
比较下面这个文本:
其中的每个数据字段之间都是使用空格分隔的:
现在我只想读取其中的数据,并去掉第一行和第一列:
示例代码如下:
<span style="font-family:Courier New;font-size:14px;">// 看你用的是一个二维数组存的,我就读取到一个二维数组里面去,但数组也应该是一个double型的数组
// 但我看数据里面的第一行和第一列中的数据不是浮点值数,是一个字符串,所以第一列和第一行的数据
// 没有读取。
#include <iostream>
#include <fstream>
#include <tchar.h>
#include <string>
#include <vector>
#include <algorithm>
#include <tchar.h>
#include <basetsd.h>
#include "boost/algorithm/string.hpp"
#include "boost/lexical_cast.hpp"
using namespace std;
#define MAX_ROW (36-1) // 最大行(去掉第一行)
#define MAX_COL (73-1) // 最大列(去掉第一列)
#define MAX_BUFFER 1024
//35, 73
bool readData(double _data[][MAX_COL]);
void showData(double _data[][MAX_COL]);
int main()
{
double data[MAX_ROW][MAX_COL]; // 数据
readData(data);
showData(data);
system("pause");
return (0);
}
bool readData(double _data[][MAX_COL])
{
wfstream file(_T("ls.dataTe.txt"), ios::in || ios::out);
if (!file.is_open())
{
printf("can't open the file!");
return (false);
}
wstring str_line; // 每一行的数据
if (!getline(file, str_line)) // 去掉第一行数据
{
return (false);
}
int arr_row = 0;
int arr_col = 0;
while (getline(file, str_line))
{
vector<wstring> line_data_vc;
boost::algorithm::split(line_data_vc, str_line, boost::is_any_of(_T(" "))); // 分割字符串
for_each(++(line_data_vc.begin()), line_data_vc.end(), [&](const wstring &_str)
{
_data[arr_row][arr_col++] = boost::lexical_cast<double>(_str); // 将字符串转换成double型
}
);
++arr_row;
arr_col = 0;
}
return (true);
}
void showData(double _data[][MAX_COL])
{
wcout.setf(ios::fixed);
wcout.precision(14);
for (UINT32 i = 0; i < MAX_ROW; ++i)
{
for (UINT32 j = 0; j < MAX_COL; ++j)
{
wcout << _data[i][j] << _T(" ");
}
wcout << endl << endl;
}
}
</span>
测试结果:
可以看到最后一行的数据也是正确的。
boost::algorithm中的string库是很实用的一个库,可以很方便的帮助我们进行文本处理。