CFileDialog類與16進制格式的dat文件

要將數據保存爲.dat文件,並且是16進制的數字,怎麼保存?html

要讀取.dat文件,文件是16進制的,怎麼讀取?數組

用CFileDialog類能夠獲得【保存】和【打開】的對話框,具體怎麼保存和讀取,須要咱們本身寫代碼了。這裏,和你們分享一下,怎麼保存16進制的文件到.dat中?怎樣從.dat中讀取你保存的16進制數字?ide

對於讀取到的這些數據,你想作什麼,能夠因人而異。您能夠在看懂本篇文章的基礎上,觸類旁通。函數

本人也是菜鳥,也是參考了不少論壇上高手的代碼。代碼雖然能經過編譯,可能不是最好的。歡迎你們提出意見。spa

1、保存16進制數字的.dat文件:

 

 1     // 文件的保存
 2     // 經過CFileDialog 類,保存文件
 3     CFileDialog fileDlg(FALSE, "dat", "btypetb");
 4     fileDlg.m_ofn.lpstrTitle="請保持設置";
 5     fileDlg.m_ofn.lpstrFilter=".dat files(*.dat)\0*.dat";
 6 
 7     // 得到相對路徑(網上找的的這個方法)
 8     // 先獲取當前正在運行的程序的路徑,而後將該路徑拿來本身用 。
 9     TCHAR szFilePath[MAX_PATH + 1];
10     GetModuleFileName(NULL, szFilePath, MAX_PATH);
11     (_tcsrchr(szFilePath, _T('\\')))[1] = 0;
12     CString strtemp = szFilePath;
13     fileDlg.m_ofn.lpstrInitialDir = strtemp;
14 
15     // 定義fpFile文件指針
16     FILE   *fpFile;
17 
18     // 若是用戶點擊了保存按鈕,則執行if語句內的操做
19     if (IDOK == fileDlg.DoModal())
20     {
21         // 獲取用戶輸入的文件名。有2種方法
22         CString fileName = fileDlg.GetFileName();
23         // CString fileName = fileDlg.m_ofn.lpstrFileTitle;
24 
25         // fopen的第一個參數是帶路徑的文件名。
26         if ((fpFile = fopen(strtemp+"\\"+fileName, "w+b")) == NULL)
27             return ;
28         fwrite (datBuffer, 2 + m_DevCounts * 2,   1,   fpFile);
29         fclose(fpFile);
30    }

 

 雖然代碼裏面有註釋,我這裏仍是再解釋一部分代碼:.net

1.代碼第3行,第一個參數false,表示咱們須要一個【保存】的對話框。若是傳遞true,那麼你將獲得【打開】的對話框。第二個參數是保存文件默認的文件格式,這裏是dat格式。第三個參數比較重要了,是你默認的文件名。參數傳遞的個數,不是固定的,你能夠傳入1個參數,也能夠傳入多個參數,根據我的須要而定。更多解釋,您能夠參考MSDN。指針

2.代碼第5行,這是設置格式過濾器。我也是參考孫鑫的《VC++深刻詳解》第12章中提到的文件過濾器來作的。下面的代碼是教程中的代碼,您能夠本身手動設置幾回,弄懂以後,修改成本身須要的就能夠了。code

1     CFileDialog fileDlg(TRUE);
2     fileDlg.m_ofn.lpstrTitle="個人文件打開對話框";
3     fileDlg.m_ofn.lpstrFilter="Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0";
View Code

 

3.代碼第7行到第13行,是參考了網上一位高手的回帖。orm

4.注意第26行代碼裏面的參數。這裏是設置爲二進制的寫。您能夠參考MSDN瞭解跟多信息。htm

5.看第28行代碼。這是咱們的重點。文件操做3部曲:1.打開文件;2.Write/Read文件;3.關閉文件

第28行代碼中,第一個參數,是保存了這些16進制數字的數組,第2個參數,是數組的大小(爲何個人第二個參數是這樣樣子的,您就沒必要糾結了。這是我程序中的實際傳遞過來的參數。您能夠根據實際狀況來決定您的數組大小。);其餘參數,參考MSDN。

datBuffer是這樣定義的:BYTE  datBuffer[200]; // 數組長度根據您我的實際來設置。

BYTE 是 unsigned char 類型  // 在你進行類型轉換的時候,會頗有用

爲何定義爲BYTE就是能保存16進制數字了,其實我也不太清楚

我也是在網上參考高手的代碼,才實現上述功能的。剛纔在網上又搜了一下,這裏有個將BYTE和16進制之間的關係的文章,能夠看看。

http://www.360doc.com/content/11/0222/22/4780948_95250828.shtml

回到文章中來,咱們就這麼一 Write,就能成功生成16進制的.dat文件了。哈哈,是否是感受特厲害。。。。。。

在成功的同時,咱們也應該知道,其實仍是有一些知識點沒有消化。。。歡迎高手指點。

補充一點:

.dat存儲的時候,是以BYTE來存儲的。說得通俗點,就是unsigned char 類型來存儲的。
而個人原始數據是int類型。。。將int轉爲16進制的BYTE。這裏,不須要用到什麼函數。
直接,強制類型轉換。便可。不須要想太多、太複雜。

int a1=10, a2=192;
BYTE arr[4] = {0};
arr[0] = (unsigned char)a1;
arr[1] = (unsigned char)a2;
arr[2] = 0xaa;

//上面的賦值代碼都是合法的。

// 這樣作就很好了。還須要啥函數來轉換。。

// 活學活用啊。。。我當時鑽牛角尖了。

2、讀取16進制數字的.dat文件:

 1     CFileDialog fileDlg(TRUE);
 2     fileDlg.m_ofn.lpstrTitle="打開個人dat文件";
 3     fileDlg.m_ofn.lpstrFilter=".dat files(*.dat)\0*.dat";
 4 
 5     // 得到相對路徑(網上找的的這個方法)
 6     // 先獲取當前正在運行的程序的路徑,而後將該路徑拿來本身用 。
 7     TCHAR szFilePath[MAX_PATH + 1];
 8     GetModuleFileName(NULL, szFilePath, MAX_PATH);
 9     (_tcsrchr(szFilePath, _T('\\')))[1] = 0;
10     CString strtemp = szFilePath;
11     fileDlg.m_ofn.lpstrInitialDir = strtemp;
12 
13     // 定義fpFile文件指針
14     FILE *fpFile;
15 
16     if (IDOK == fileDlg.DoModal())
17     {
18         long Filelen;
19         // 注意細節
20         unsigned char* buffer;
21         
22         CString fileName = fileDlg.GetPathName();
23         
24         if ((fpFile = fopen(fileName, "rb")) == NULL)
25             return ;
26 
27         // 文件指針到文件尾
28         fseek(fpFile, 0, SEEK_END);
29         // 讀取文件長度
30         Filelen = ftell(fpFile);
31         // 分配內存
32         // 按文件長度申請內存空間
33         buffer = (unsigned char*)malloc(Filelen);
34 
35         // 文件指針指到文件頭
36         fseek(fpFile, 0, SEEK_SET);
37         // 讀取文件到申請的內存
38         fread(buffer, 1, Filelen, fpFile);
39         fclose(fpFile);
40         
41         // 到這裏,其實buffer裏面已經存放了你須要的數據,你能夠作你須要的操做了。
42         // 這裏,將讀取的16進制數字,在MessageBox中顯示出來。
43         CString strResult;
44         for(int j=0; j<Filelen; j++)
45         {
46             CString s = "";
47             s.Format("%2.2x ", buffer[j]);
48             strResult += s;
49         }
50 
51         MessageBox(strResult);
52     }

 

1.代碼第1行,這裏傳遞的參數是TRUE。表示,咱們須要一個【打開】的對話框。

2.代碼第20行,咱們定義的是 unsgined char* 類型的變量。

3.從代碼第28行開始,是重點了。

4.在代碼第24行中,設置了爲二進制打開。

5.第38行代碼,將數據讀入到buffer中了。到此,你已經獲得你想要的16進制數字了。你想怎麼處理,能夠根據實際狀況來實際操做。這裏再說一次,buffer定義的是unsigned char*類型,在進行強制類型轉換的時候,會有用的。

6.在這裏,咱們想將.dat文件裏的16進制數字在MessageBox對話框中顯示出來,咱們能夠看第44行的代碼。

補充一點:

若是你想將這些16進制數字顯示出來的話,第41行到第51行的代碼能夠實現此功能。

若是你想將讀取的16進制數字用做其餘用途,我的是這麼理解的。

經過第38行的代碼,你的buffer數組中,已經存放了16進制的數字了。

16進制數字對我來講,沒多大用。(至少我當前程序中沒有涉及到這方面的問題)

我當時是這麼作的,將16進制的數字轉換爲整型的數字。整型是你們都熟悉的類型,而後你就能夠想幹什麼就幹什麼了。

(若是您在數值之間的轉換方面遇到了一些問題,我的建議仍是多看看這些類型的定義(通常,C++基礎教程裏面都會講到的,溫故而知新)。好比BYTE實際上是unsigned char類型,char和int之間是能夠相互轉換的,可是要注意char的範圍,也要知道,unsgined char 和 char 做用的範圍不一樣,當心數據丟失哦。)

int Num1, Num2;
Num1 = buffer[0];
Num2 = buffer[1];

 

 

總結:感謝,感謝網上各位高手。

這裏是幾個值得參考的帖子:

http://bbs.csdn.net/topics/300048398

http://bbs.csdn.net/topics/320263449

相關文章
相關標籤/搜索