1.创建或者创建一个文件夹
std::string path = "/home/zpf/zpf/floder/";
std::string command;
//command = "mkdir -p " + path; //创建文件夹
command = "rm -r " + path; //删除文件夹
system(command.c_str());
注意,小心坑:-r和-p后面一定要加空格,和命令行格式保持一致
2.遍历文件夹,保存文件名
#include <unistd.h>
#include <dirent.h>
//遍历文件夹,将文件名保存起来
std::vector<std::string> file_name;
file_name.clear();
DIR *dir;
struct dirent *ptr;
if ((dir = opendir(data_temp_path.c_str())) == NULL)
{
LOG(error) << "Open dir error!";
}
while ((ptr=readdir(dir)) != NULL)
{
if (ptr->d_name[0] == '.'){
continue; //跳过'.'和'..'两个目录
}
file_name.emplace_back(ptr->d_name);
}
closedir(dir);
注意:要跳过'.'和’..‘两个目录才能得到正确结果
3.删除文件
std::string path = folder_path + file_name;//一个文件的绝对路径
std::string command;
command = "rm " + path;
std::system(command.c_str());
4.修改文件名
std::string cy1 = folder_path+"/"+old_name;
std::string cy2 =folder_path+"/"+new_name;
std::string cy_command1 = "mv " + cy1 + " " + cy2;
std::system(cy_command1.c_str());
5.数据写入文件
std::string path = folder_path + file_name;
std::ofstream outFile(path,std::ios::out);
if(!outFile){ //有此文件,就在原文件上写入,没有则会生成一个新的文件
return 0;
}
outFile << points_list[0];
int points_num = points_list.size();
for (int i=1 ; i<points_num ; ++i)
{
outFile <<","<<points_list[i].get_pointId();
}
outFile << std::endl; //第一行写完,换行
int result_size = result.size(); //result是一个按行存放的std::vector<std::vector<std::string>>格式的二位数组
for(int i=0;i<result_size;++i){
outFile<<result[i][0];
for(int j=1;j<points_num;++j){
outFile<<","<<result[i][j];
}
outFile<<std::endl;
}
outFile.close();
6.读取文件夹下对应文件.csv里的内容,一行行的读,采用stringstream和getline
std::string path = folder_path + "/" + file_name; //单个文件,可与上面2结合循环处理每个文件
std::ifstream inFile(path,std::ios::in);
if (!inFile) //no file
{
return 0;
}
std::vector<std::vector<double>> result; //按行存放
result.clear();
std::vector<double> temp;//用于保存每行的数据
std::string lineStr; //保存读取到的一行数据
std::string str; //用于暂时保存中间字符串,分词用
std::stringstream ss1; //根据分隔符来分词
std::stringstream ss2; //自动转化流的格式
std::getline(inFile,lineStr);//读第一行,第一行的格式与其他行不一样
int column;//数据的列数
while (std::getline(inFile,lineStr))
{
ss1.clear();
ss1.str("");
ss1<<lineStr;
double data_temp;
temp.clear();
for (int k=0 ; k<column ; ++k)//
{
std::getline(ss1,str,',');
ss2.clear();
ss2.str("");
ss2<<str;
ss2>>data_temp;
temp.emplace_back(data_temp);
}
result.emplace_back(temp);
}
inFile.close();