6.1.5 文本文件與二進制文件

6.1.5  文本文件與二進制文件
文本文件與二進制文件實際上沒有太大的區別,一般來講,文本文件僅用來存儲可打印字符(如:字母、數字、空格等),文本文件也可以以二進制方式打開,如圖6-6所示的是在UltraEdit-32中以二進制的方式查看文本文件的情形。
 
(點擊查看大圖)圖6-6  文本文件的二進制查看方式
文本與二進制的另外一種區別體現在人們的習慣:在文本模式中,當我們談及"65"時,它一般指代字符串"65",如圖6-7所示,"65"是2個字符,它們在二進制中顯示成十六進制的"0x3635"。
 
(點擊查看大圖)圖6-7  文本文件中的"65"
但是在二進制模式下,當我們談及"65"時,那一般都指代數值65,如圖6-8所示的數值65的二進制內容(在十六進制中,65表示成0x41),一旦我們切換到文本查看模式,它則對應於ASCII碼中的"A"字符。
 
(點擊查看大圖)圖6-8  二進制文件中的數值65
可以看出,文本格式和二進制格式還是有差別的。如果以文本方式寫入"65",而以二進制文件讀取的話,則會認爲它的值爲0x3635,這樣,就會給軟件程序帶來致命的差錯。
在Windows API世界裏,根本就沒有所謂的文本文件的讀寫函數,所有的緩衝內容的訪問都是通過char *指針完成的,至於其內容是文本還是二進制,則是應用程序的責任了。
現在動手
編寫如下程序,體驗文本與二進制內容的存取操作。
【程序 6-2】文本與二進制內容的存儲
 
  1. 01  #include "stdafx.h" 
  2. 02  
  3. 03  int main()  
  4. 04  {  
  5. 05      char s1[4] = "65";  
  6. 06      int n1 = 65;  
  7. 07  
  8. 08      //寫  
  9. 09      CFile file;  
  10. 10      file.Open(_T("test.out"), 
    CFile::modeWrite | CFile::modeCreate);  
  11. 11  
  12. 12      //寫入文本"65"  
  13. 13      file.Write(s1, sizeof(s1));  
  14. 14      //寫入數值65  
  15. 15      file.Write(&n1, sizeof(n1));  
  16. 16  
  17. 17      file.Close();  
  18. 18  
  19. 19      //讀  
  20. 20      file.Open(_T("test.out"), CFile::modeRead);  
  21. 21      char s2[4];  
  22. 22      int n2;  
  23. 23  
  24. 24      //先讀文本,再讀數值  
  25. 25      file.Read(s2, sizeof(s2));  
  26. 26      file.Read(&n2, sizeof(n2));  
  27. 27  
  28. 28      printf("s2=%s\r\n", s2);  
  29. 29      printf("n2=%d\r\n", n2);  
  30. 30  
  31. 31      //先讀數值,再讀文本  
  32. 32      file.SeekToBegin();  
  33. 33      file.Read(&n2, sizeof(n2));  
  34. 34      file.Read(s2, sizeof(s2));  
  35. 35  
  36. 36      printf("s2=%s\r\n", s2);  
  37. 37      printf("n2=%d\r\n", n2);  
  38. 38  
  39. 39      file.Close();  
  40. 40      return 0;02 } 
運行結果如圖6-9所示。
 
(點擊查看大圖)圖6-9  運行結果
這個例子告訴我們:在讀文件時,其順序應該和寫文件的順序一致,否則會帶來不可預測的錯誤。
光盤導讀
該項目對應於光盤中的目錄"\ch06\CFileTest"。
 
====未完待續====
以上摘自《把脈VC++》第6.1小節的內容 ,轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章