关于句柄
文件读取句柄使用
务必添加io.h
struct _finddata_t
{
unsigned attrib; //无符号整形、位表示。它的作用是表示文件的属性,一般来说,文件的属性有如下几种:
//_A_SUBDIR(文件夹)、_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SYSTEM(系统)
time_t time_create;//表示从1970年1月1日0时0分0秒到现在时刻的秒数。
time_t time_access;//文件最后一次被访问的时间
time_t time_write;//文件最后一次被修改的时间
_fsize_t size; //文件的大小
char name[_MAX_FNAME];
};
//配合使用以下函数
long _findfirst(char *filespec, struct _finddata_t *fileinfo);//文件所在文件夹路径,文件结构体_finddata_t
//如果查找成功,那么就返回一个long型的唯一查找用的句柄。这个句柄会在_findnext函数中被使用。失败的话就会返回-1.
int _findnext(long handle, struct _finddata_t *fileinfo);//handle:即由_findfirst函数返回回来的句柄 0 or -1.
int _findclose(long handle);
关于fstream
#include <iostream>
#include<vector>
#include<fstream>
#include<string>
#include<io.h>
#include<deque>
#include <thread> //多线程
#include<sstream> //stringstream流
批量读取某一文件夹下的文件
使用句柄
void getFiles(const string& path,deque<string>& files)
{
//文件句柄
long long hFile = 0;
//文件信息,_finddata_t需要io.h头文件
struct _finddata_t fileinfo;
std::string p;
int i = 0;
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
{
do
{
//如果是目录,迭代之
//如果不是,加入列表
if ((fileinfo.attrib== _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
//files.push_back(p.assign(path).append("\\").append(fileinfo.name));
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
void Read(deque<string> files, vector<SpatialObj*>& obj, string path)
{
getFiles(path, files);
double j = 0;
int num;
double a = 0, b = 0, c = 0, d = 0;
for (auto i : files)
{
num = 0;
ifstream ifs; //1
ifs.open(i, ios::in); //2
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
}
else
{
string buf;
while (getline(ifs, buf)) //3
{
++num;
SpatialObj * tmp = new SpatialObj;//为SpatialObj对象开辟空间
vector<string> read = split(buf, ", -:");//以逗号作为分隔符,将整行的字符串切割开来
tmp->num = num;
tmp->id = atoi(read[0].c_str());//将切割开的得到第一个数据经过类型转换后存入车辆ID
//tmp->obj_t = String2WString(read[1]); //将切割开的得到第二个数据存入经过时间
tmp->time = atof((read[1] + read[2] + read[3] + read[4] + read[5] + read[6]).c_str());
tmp->x = atof(read[7].c_str());//将切割开的得到第三个数据存入点位经度
tmp->y = atof(read[8].c_str()); //将切割开的得到第二个数据存入点位纬度
obj.push_back(tmp);//将该指针存入容器中
}
}
++j;
cout << "读取出租车轨迹文件中......" << 100 * (j / files.size()) << "%" << endl;
}
if (j == files.size()&&j!=0)
{
cout << "数据读入完成!" << endl;
}
}
使用循环
void File(string path, vector<SpatialObj*>&obj)
{
string aline; int num = 0;
for (int i = 0; i < 31; i++)
{
ifstream ifs;
stringstream ss;
ss << path << "\\" << i << ".txt";
string si = ss.str();
ifs.open(si, ios::in);
if(!ifs)
cout << "Open file failure" << endl;
else {
cout << i;
while (getline(ifs, aline))
{
vector<string> read = split(aline, ": -,");
++num;
SpatialObj * tmp = new SpatialObj;//为SpatialObj对象开辟空间
tmp->num = num;
tmp->id = atoi(read[0].c_str());//将切割开的得到第一个数据经过类型转换后存入车辆ID
//tmp->obj_t = String2WString(read[1]); //将切割开的得到第二个数据存入经过时间
tmp->time = atof((read[1] + read[2] + read[3] + read[4] + read[5] + read[6]).c_str());
tmp->x = atof(read[7].c_str());//将切割开的得到第三个数据存入点位经度
tmp->y = atof(read[8].c_str()); //将切割开的得到第二个数据存入点位纬度
obj.push_back(tmp);
}
}
}
}
文件写入
void writes(string path,vector<info*> obj)
{
ofstream ofs;
path.append("\\out.txt");
ofs.open(path, ios::app);
for (int i = 0; i < obj.size(); i++)
{
ofs << obj[i]->id << " "<< obj[i]->name << " " << obj[i]->grade << endl;
}
}
参考文献:
1.C++中_finddata_t结构体存储文件信息
https://blog.csdn.net/sagghab/article/details/81436515
https://wenku.baidu.com/view/34edca4cf7ec4afe04a1df2f.html
2.句柄
https://www.cnblogs.com/vinsonLu/p/3613453.html
3.getline 与cin搭配实现行输入
http://c.biancheng.net/view/1345.html
4.格式化字符串
https://blog.csdn.net/qq_29695701/article/details/99059536
5.fstream文件流
https://www.cnblogs.com/1242118789lr/p/6885691.html