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