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;
}