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;
然后,用转换过来的string型变量,来初始化stringstream 变量;
最后,根据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