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