浅谈文件读写——C++

关于句柄

文件读取句柄使用
务必添加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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值