C++

C++ 读写CSV

关于csv格式文件的读写

Posted by VK on January 28, 2020

C++ 读写CSV

首先通过rand_device 产生随机种子,然后通过mt199937 设置随机引擎,通过平均分布产生随机数,调用了分布算法产生的每个随机值都依赖与上一个随机值产生。

通过读取csv文件,csv文件都是用逗号分割,获取字符串,然后通过分割函数,将分割字符串存进容器,最后通过模板函数stringstream实现转换

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <random>
#include <sstream>

using namespace std;

void spilt(const string &line, const string &c, vector<string> &v);

template<typename T>
T StringToNum(const string &s);

void readfile()
{
	ifstream in;
	in.open("test5000.csv",ios::in);
	if(in.fail())
	{
		cout<<"File not found"<<endl;
		return;
	}

	string line;
	char *p;
	std::vector<string> v;
	while(getline(in,line) && in.good())
	{
		spilt(line,",",v);
	}
/*
在stream流类型中,有一个成员函数good().用来判断当前流的状态(读写正常(即符合读取和写入的类型),没有文件末尾)
对于类 读写文件 fstream ifstream ofstream 以及读写字符串流stringstream istringstream ostringstream等类型。都用good()成员函数来判断当前流是否正常。
*/

	for(auto i:v)
	{
		cout<<StringToNum<float>(i)<<endl;
	}

	in.close();

}



template<typename T>
T StringToNum(const string &s)
{
	istringstream iss(s);
	T num;
	iss>>num;
	return num;
}



void spilt(const string &line, const string &c, vector<string> &v)
{
	int pos1 = 0;
	int pos2 = line.find(c);

	while(string::npos != pos2)
	{
		v.push_back(line.substr(pos1,pos2-pos1));
		pos1 += pos2+c.size();
		pos2 = line.find(c,pos1);
	}
  
  /*
  	substr有2种用法:
	假设:string s = "0123456789";
	string sub1 = s.substr(5); //只有一个数字5表示从下标为5开始一直到结尾:sub1 = "56789"
	string sub2 = s.substr(5, 3); //从下标为5开始截取长度为3位:sub2 = "567"
  */
}


int main()
{
	random_device rd;
	mt19937 gen(rd());
	uniform_real_distribution<> dist(-1.0,1.0); //设置随机数范围为-1.0~1.0之间的浮点数

	ofstream outFile;
	outFile.open("test5000.csv",ios::out);
	for(int i=1;i<5;i++){
		for(int j=1;j<3;j++){
			outFile<<dist(gen)<<",";
		}
		outFile<<endl;
	}
		
	outFile.close();

	readfile();
	return 0;
}