C++ 讀取二進制文件


這幾天在研究C++二進制文件的讀取,對C++還不是很熟悉,所以一開始以為直接一行一行的讀取出來,就會是我們所熟悉的文本格式了,結果打印出來全是亂碼。因此找了很多人幫忙,也看了很多博客,最終終於了解了。在這里把學到的重要的東西分享一下。

////////////////////////////////////////////////////////////////////////////////////

//以下內容來自佳哥童鞋:

不只是C/C++標准庫,使用其它庫時也要注意區分“文本”和“二進制”模式。打開文件,讀寫文件都不能混着來。

讀二進制流就很好理解了,就是一字節一字節的。

至於文本,C/C++標准庫的“文本”就只支持ASCII字符集的。如果你發現你正在使用的標准庫可以處理漢字什么的,那只是操作系統提供的假象,沒有可移植性。所以如果文本文件中有非ASCII字符,就不要考慮用C/C++標准庫做文本處理了。

一個ASCII字符雖然也是一個字節,但與二進制字節是沒有“一對一”的對應關系的。例如在Windows系統上,“換行”被表示為‘\r’‘\n’兩個字節,如果一個文件中的內容是:‘A’‘B’‘\r’‘\n’‘C’5個字節:

那用文本讀,會得到4個字符:

字符‘A’

字符‘B’

換行符(就是‘\n’)

字符‘C’

用二進制讀字節流,是5個字節:

字節0x41(‘A’)

字節0x42(‘B’)

字節0x0D(回車符)

字節0x0A(換行符)

字節0x42(‘C’)

此外,如果文件頭部有標記文本格式的頭部(例如utf-16大端,標識為FF FE),文本模式下也會被忽略掉。

////////////////////////////////////////////////////////////////////////////////////

因此,想要實現二進制數據讀取出來能是我們所熟悉的文本格式,需要對二進制文件的文件結構非常了解,並且知道,每個部分的數據類型才能成功轉換。

 

這里還有一些關於文件操作的重要鏈接,有興趣的可以好好看看:

http://www.cplusplus.com/reference/cstdio/fgets/

http://www.cplusplus.com/reference/cstdio/fread/

http://www.cplusplus.com/reference/cstdio/fseek/

 

http://www.cnblogs.com/greatverve/archive/2012/10/29/cpp-io-binary.html

http://blog.csdn.net/caowei880123/article/details/5974543

http://blog.csdn.net/jiahehao/article/details/1862879

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM