摘要:
使用C++讀寫二進(jìn)制文件,在開發(fā)中操作的比較頻繁,今天有幸找到一篇文章,遂進(jìn)行了一些試驗,并進(jìn)行了部分的總結(jié)。
使用C++操作文件,是研發(fā)過程中比較頻繁的,因此進(jìn)行必要的總結(jié)和封裝還是十分有用的。今天在網(wǎng)上找到一篇,遂進(jìn)行了部分的試驗,以記之,備后用。
?
本文讀寫文件均使用文件流進(jìn)行操作,主要使用的類是ifstream,?ofstream,?使用時,請務(wù)必包含文件fstream。如下:
#include?
?
?
寫二進(jìn)制文件
寫二進(jìn)制文件應(yīng)該使用ofstream類,文件的打開模式一定要是?binary,如果傳入的不是?binary,?文件將以ASCII方式打開。
?
下面是示例代碼,用于寫入文件。
?
std::ofstream?fout("a.dat",?std::ios::binary);
?
int?nNum?=?20;
std::string?str("Hello,?world");
?
fout.write((char*)&nNum,?sizeof(int));
fout.write(str.c_str(),?sizeof(char)?*?(str.size()));
?
fout.close();
?
而寫文本文件則比較簡單,如下:
?
std::ofstream?fout("b.dat");
?
int?nNum?=?20;
std::string?str("Hello,?world");
?
fout?<<?nNum?<<?","?<<?str?<<?std::endl;
?
fout.close();
??
?
讀二進(jìn)制文件
讀取二進(jìn)制文件可以使用ifstream?類來進(jìn)行,文件的打開模式一定要是?binary,如果傳入的不是?binary,?文件將以ASCII方式打開。
?
下面是示例代碼:
?
std::ifstream?fin("a.dat",?std::ios::binary);
?
int?nNum;
char?szBuf[256]?=?{0};
?
fin.read((char*)&nNum,?sizeof(int));
fin.read(szBuf,?sizeof(char)?*?256);
?
std::cout?<<?"int?=?"?<<?nNum?<<?std::endl;
std::cout?<<?"str?=?"?<<?szBuf?<<?std::endl;
?
fin.close();
?
而讀取文本文件則比較簡單:
?
std::ifstream?fin("b.dat");
?
int?nNum;
char?szBuf[256]?=?{0};
?
fin?>>?nNum?>>?szBuf;
?
std::cout?<<?"int?=?"?<<?nNum?<<?std::endl;
std::cout?<<?"str?=?"?<<?szBuf?<<?std::endl;
?
fin.close();
?
文件的打開模式
文件操作時,如果不顯示指定打開模式,文件流類將使用默認(rèn)值。
在
?ios::app?//?從后面添加
?ios::ate?//?打開并找到文件尾
?ios::binary?//?二進(jìn)制模式I/O(與文本模式相對)
?ios::in?//?只讀打開
?ios::out?//?寫打開
?ios::trunc?//?將文件截為?0?長度
可以使用位操作符?OR?組合這些標(biāo)志,比如
?ofstream?logFile("log.dat",?ios::binary?|?ios::app);
?
?
二進(jìn)制文件的復(fù)制
這里我實現(xiàn)了一個二進(jìn)制文件的復(fù)制操作,用于驗證讀寫的正確性,示例代碼如下:
[cpp]?view plain?copy bool?copy_binary_file(const?char?*?szDestFile,?const?char?*?szOrigFile)?? {?? ????if?(szDestFile?==?NULL)?? ????{?? ????????return?false;?? ????}?? ?? ????if?(szOrigFile?==?NULL)?? ????{?? ????????return?false;?? ????}?? ?? ????bool?bRet?=?true;?? ?? ????std::ofstream?fout(szDestFile,?std::ios::binary?|?std::ios::app);?? ????std::ifstream?fin(szOrigFile,?std::ios::binary);?? ?? ????if?(fin.bad())?? ????{?? ????????bRet?=?false;?? ????}?? ????else?? ????{?? ????????while(!fin.eof())?? ????????{?? ????????????char?szBuf[256]?=?{0};?? ?????????????? ????????????fin.read(szBuf,?sizeof(char)?*?256);?? ?????????????? ????????????if?(fout.bad())?? ????????????{?? ????????????????bRet?=?false;?? ????????????????break;?? ????????????}?? ?? ????????????//??? ????????????fout.write(szBuf,?sizeof(char)?*?256);?? ????????}?? ????}?? ?? ????fin.close();?? ????fout.close();?? ?? ????return?bRet;?? }??
?
?
后記
由于文本文件本質(zhì)上也是磁盤上的一個個二進(jìn)制編碼,因此,讀寫二進(jìn)制文件的代碼同樣可以讀寫文本文件,在文件類型不是很明確的讀寫操作中,直接使用二進(jìn)制讀寫比較可取,如果可以直接判斷文件類型,則可以分別對待。