CFileDialog、CStdioFile读取文件中的内容,每行按空格依次读入

时间:2019-01-11
本文章向大家介绍CFileDialog、CStdioFile读取文件中的内容,每行按空格依次读入,主要包括CFileDialog、CStdioFile读取文件中的内容,每行按空格依次读入使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

CFileDialog、CStdioFile读取文件中的内容,每行按空格依次读入
注:
1、该文件为固定为3列的小数txt文件,且数字之间以空格隔开
2、CFileDialog 与 CStdioFile 类:
class CFileDialog : public CCommonDialog //afxdlgs.h
class CStdioFile : public CFile //afx.h

CFileDialog 主要用于MFC界面开发中。

一、CFileDialog 与 CStdioFile 联合使用的程序大致框架如下:

注意:

		file.ReadString(Data)返回bool值,
		如果读到的该行字符长度为0,则返回0;否则,返回1,相当于文件读取结束标志!

代码:

	CFileDialog dlg(TRUE);
	dlg.m_ofn.lpstrFilter = _T("txt Files(*.txt)\0*.txt\0所有文件(*.*)\0*.*\0\0");
	if (dlg.DoModal() == IDOK)
	{
		CStdioFile file(dlg.m_ofn.lpstrFile, CFile::modeRead);//定义文件的路径和只读模式
		file.Seek(0, CFile::begin);
		CString Data;
		while (file.ReadString(Data)){//将一行数据读取到 CString Data中
			//处理每一行数字,按空格进行分割 begin
			...
			//处理每一行数字,按空格进行分割 end
		}
		file.Close();
	}

二、处理每一行数字,按空格进行分割
1、C语言 strtok方法:

			//处理每一行数字,按空格进行分割 begin
			char a[150] = "", b[150] = "";
			for (int i = 0; i < 150; i++){ a[i] = '\0'; }//强行加入了'\0',每一行字符串后面的'\0'字符结
尾符放进来
			memcpy(a, Data, Data.GetLength() * 2);//将Data赋值到a中
			for (int i = 0, j = 0; i < 150; i += 2, j++){ b[j] = a[i]; }

			C3DPoint p;
			p.x = atof(strtok(b, " "));
			p.y = atof(strtok(NULL, " "));//第二次调用该函数strtok(NULL,","),第一个参数设置为NULL。结果返回分割依据后面的字串,即第二次输出d。
			p.z = atof(strtok(NULL, " "));
			v_pointArray.push_back(p);//保存该点到向量 vector<C3DPoint> v_pointArray中
			//处理每一行数字,按空格进行分割 end

2、C++ stringstream
先将每行CString字符->string,
然后,根据stringstream 变量自动按空格分割,直接读入到C3DPoint p中即可。

			//处理每一行数字,按空格进行分割 begin
			string line = CT2A(Data.GetBuffer());//Unicode下:将CString->string  
			stringstream ss(line);//头文件 sstream.h
			C3DPoint p;
			while (ss >> p.x >> p.y >> p.z){}//知晓固定的列数为3列,即为x,y,z三个坐标值。
			v_pointArray.push_back(p);//保存该点到向量 vector<C3DPoint> v_pointArray中
			//处理每一行数字,按空格进行分割 end