天天看點

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;

然後,用轉換過來的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
           

繼續閱讀