boost split和lexical_cast配合使用处理文本

boost库中的boost::algorithm库中的split字符串分割函数,配合boost::lexical_cast类型转换函数来处理固定格式的文本非常方便:

特别是在处理.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库是很实用的一个库,可以很方便的帮助我们进行文本处理。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值