這幾天在研究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