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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章