我們通常把數據存諸在txt文件上但是我們通常要把這些數據取出來並進行處理下面我將介紹一種在VC++應用程序中讀取文本數據的方法
一前言
因為經常要處理地質方面的數據但是很多數據它不是直接存貯在數據庫文件(如Access文件等)而是存貯在txt文件經常有同學問我怎麼通過編程讀取實現文本文件中的數據其實存貯在txt文件也有它的好處不像讀取Access文件那樣要注冊數據源設置比較麻煩編寫讀取程序也比較復雜
二程序原理
首先我們知道假如要進行的文件操作只是簡單的讀寫整行的字符串那麼最好使用CStdioFile用它來進行此類操作非常方便因此我們便很自然想到首先我們把文本文件的每行數據讀到一個緩沖區然後使用sscanf把它轉化為字符格式
那麼具體該怎麼做呢?比如在一個txt文件裡每一行數據格式是這樣的
A A A A ……An
那麼讀取的主體代碼是
CStdioFile File // 定義一個CStdioFile類變量File
CString FileData // 定義一個CString作為一個緩沖區
/*定義n個臨時字符串變量大小依據實際情況這裡暫設為
*/
char TempStr[]TempStr[]……TempStrN[]
FileReadString(FileData) // 將一行數據讀到緩沖區
/*將該行數據的n個字符讀到n個臨時字符串變量*/
sscanf(FileData%s %s %s %s ……%sTempStrTempStr……TempStrN)
這種讀法的一個好處是對文本格式要求不嚴如下面的格式也可以(前面可有未知個空格) A A (兩個數據之間也可有未知個空格) A A ……An
三編程步驟
下面我以一個單文檔程序來具體說明我的做法該程序的主要功能是讀取文本文件的坐標數據然後在客戶區裡用直線將這些坐標連起來並顯示
啟動Visual C++生成一個單文檔的工程將該工程命名為ReadCoodinate
添加一個讀取文本數據的菜單項
給視圖類添加兩個public變量
CArray<CPointCPoint> m_PointArray // 用於記錄坐標點數據
int m_PointNum // 用於記錄坐標點個數在視圖類構造函數中初始化為
給讀取文本數據添加相應的單擊消息響應函數代碼如下
void CReadCoodinateViewOnReaddata()
{
// TODO Add your command handler code here
CFileDialog dlg(TRUE) // 定義一個文件對話框變量
if(dlgDoModal()==IDOK)
{
CString m_FilePath = dlgGetPathName() //取得文件路徑及文件名
CStdioFile File
FileOpen(m_FilePathCFilemodeRead) //以讀模式打開文本文件
CString FileData //定義一個CString變量作為緩沖區
FileReadString(FileData)//讀取第一行數據第一行數據為坐標點數據
/*定義兩個臨時字符串並初始化為\*/
char TempStr[]
char TempStr[]
memset(TempStr\)
memset(TempStr\)
sscanf(FileData%sTempStr)
m_PointNum = atoi(TempStr) // 獲取坐標點個數
/*逐行讀取坐標數據*/
for (int i = i<m_PointNumi++)
{
FileReadString(FileData)
sscanf(FileData%s %sTempStrTempStr)
m_PointArrayAdd(CPoint(atoi(TempStr)atoi(TempStr)))//將其存入坐標點數組
}
CDC *pDC = GetDC() //獲取設備環境
/*根據坐標點繪出直線*/
for (i = i<m_PointNumi++)
{
pDC>MoveTo(m_PointArray[i]xm_PointArray[i]y)
pDC>LineTo(m_PointArray[i+]xm_PointArray[i+]y)
}
ReleaseDC(pDC) //使用完後釋放設備環境
}
}
程序運行結果的效果圖如下
選取一個txt文件
單擊確定後繪制直線如下圖
其中示例數據文件的格式是這樣的(第一行為坐標個數余下的是坐標點數據)
這個程序的一個優點是對文本數據格式並不嚴格你可以把數據編輯成下面形式但讀出來的效果是一樣的(只要x坐標和y坐標中間有一個空格就可以了)
三小結
上面只是小小的示例讀者朋友可以將文本數據傳化為其它形式的數據(如將字符型數據轉化為浮點型)進行更復雜的數據處理其中原理是一樣的上面程序的編譯環境是WinVC++
From:http://tw.wingwit.com/Article/program/net/201311/11932.html