亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++編程中對二進制文件的讀寫操作

2020-05-23 14:13:55
字體:
供稿:網(wǎng)友

這篇文章主要介紹了C++編程中對二進制文件的讀寫操作,是C++入門學習中的基礎(chǔ)知識,需要的朋友可以參考下

二進制文件不是以ASCII代碼存放數(shù)據(jù)的,它將內(nèi)存中數(shù)據(jù)存儲形式不加轉(zhuǎn)換地傳送到磁盤文件,因此它又稱為內(nèi)存數(shù)據(jù)的映像文件。因為文件中的信息不是字符數(shù)據(jù),而是字節(jié)中的二進制形式的信息,因此它又稱為字節(jié)文件。

對二進制文件的操作也需要先打開文件,用完后要關(guān)閉文件。在打開時要用ios::binary指定為以二進制形式傳送和存儲。二進制文件除了可以作為輸入文件或輸出文件外,還可以是既能輸入又能輸出的文件。這是和ASCII文件不同的地方。

用成員函數(shù)read和write讀寫二進制文件

對二進制文件的讀寫主要用istream類的成員函數(shù)read和write來實現(xiàn)。這兩個成員函數(shù)的原型為

 

 
  1. istream& read(char *buffer,int len); 
  2. ostream& write(const char * buffer,int len); 

字符指針buffer指向內(nèi)存中一段存儲空間。len是讀寫的字節(jié)數(shù)。調(diào)用的方式為:

 

 
  1. a. write(p1,50); 
  2. b. read(p2,30); 

上面第一行中的a是輸出文件流對象,write函數(shù)將字符指針p1所給出的地址開始的50個字節(jié)的內(nèi)容不加轉(zhuǎn)換地寫到磁盤文件中。在第二行中,b是輸入文件流對象,read 函數(shù)從b所關(guān)聯(lián)的磁盤文件中,讀入30個字節(jié)(或遇EOF結(jié)束),存放在字符指針p2所指的一段空間內(nèi)。

[例] 將一批數(shù)據(jù)以二進制形式存放在磁盤文件中。

 

 
  1. #include <fstream> 
  2. using namespace std; 
  3. struct student 
  4. char name[20]; 
  5. int num; 
  6. int age; 
  7. char sex; 
  8. }; 
  9. int main( ) 
  10. student stud[3]={"Li",1001,18,'f',"Fun",1002,19,'m',"Wang",1004,17,'f'}; 
  11. ofstream outfile("stud.dat",ios::binary); 
  12. if(!outfile) 
  13. cerr<<"open error!"<<endl; 
  14. abort( );//退出程序 
  15. for(int i=0;i<3;i++) 
  16. outfile.write((char*)&stud[i],sizeof(stud[i])); 
  17. outfile.close( ); 
  18. return 0; 

用成員函數(shù)write向stud.dat輸出數(shù)據(jù),從前面給出的write函數(shù)的原型可以看出: 第1個形參是指向char型常變量的指針變量buffer,之所以用const聲明,是因為不允許通過指針改變其指向數(shù)據(jù)的值。形參要求相應的實參是字符指針或字符串的首地址。現(xiàn)在要將結(jié)構(gòu)體數(shù)組的一個元素(包含4個成員)一次輸出到磁盤文件stud.dat。&tud[i] 是結(jié)構(gòu)體數(shù)組第i個元素的首地址,但這是指向結(jié)構(gòu)體的指針,與形參類型不匹配。因此 要用(char *)把它強制轉(zhuǎn)換為字符指針。第2個參數(shù)是指定一次輸出的字節(jié)數(shù)。sizeof (stud[i])的值是結(jié)構(gòu)體數(shù)組的一個元素的字節(jié)數(shù)。調(diào)用一次write函數(shù),就將從&tud[i]開始的結(jié)構(gòu)體數(shù)組的一個元素輸出到磁盤文件中,執(zhí)行3次循環(huán)輸出結(jié)構(gòu)體數(shù)組的3個元素。

其實可以一次輸出結(jié)構(gòu)體數(shù)組的個元素,將for循環(huán)的兩行改為以下一行:

 

 
  1. outfile.write((char*)&stud[0],sizeof(stud)); 

執(zhí)行一次write函數(shù)即輸出了結(jié)構(gòu)體數(shù)組的全部數(shù)據(jù)。

abort函數(shù)的作用是退出程序,與exit作用相同。

可以看到,用這種方法一次可以輸出一批數(shù)據(jù),效率較高。在輸出的數(shù)據(jù)之間不必加入空格,在一次輸出之后也不必加回車換行符。在以后從該文件讀入數(shù)據(jù)時不是靠空格作為數(shù)據(jù)的間隔,而是用字節(jié)數(shù)來控制。

[例] 將剛才以二進制形式存放在磁盤文件中的數(shù)據(jù)讀入內(nèi)存并在顯示器上顯示。

 

 
  1. #include <fstream> 
  2. using namespace std; 
  3. struct student 
  4. string name; 
  5. int num; 
  6. int age; 
  7. char sex; 
  8. }; 
  9. int main( ) 
  10. student stud[3]; 
  11. int i; 
  12. ifstream infile("stud.dat",ios::binary); 
  13. if(!infile) 
  14. cerr<<"open error!"<<endl; 
  15. abort( ); 
  16. for(i=0;i<3;i++) 
  17. infile.read((char*)&stud[i],sizeof(stud[i])); 
  18. infile.close( ); 
  19. for(i=0;i<3;i++) 
  20. cout<<"NO."<<i+1<<endl; 
  21. cout<<"name:"<<stud[i].name<<endl; 
  22. cout<<"num:"<<stud[i].num<<endl;; 
  23. cout<<"age:"<<stud[i].age<<endl; 
  24. cout<<"sex:"<<stud[i].sex<<endl<<endl; 
  25. return 0; 

運行時在顯示器上顯示:

 

 
  1. NO.1 
  2. name: Li 
  3. num: 1001 
  4. age: 18 
  5. sex: f 
  6.  
  7. NO.2 
  8. name: Fun 
  9. num: 1001 
  10. age: 19 
  11. sex: m 
  12.  
  13. NO.3 
  14. name: Wang 
  15. num: 1004 
  16. age: 17 
  17. sex: f 

請思考,能否一次讀入文件中的全部數(shù)據(jù),如:

 

 
  1. infile.read((char*)&stud[0],sizeof(stud)); 

答案是可以的,將指定數(shù)目的字節(jié)讀入內(nèi)存,依次存放在以地址&tud[0]開始的存儲空間中。要注意讀入的數(shù)據(jù)的格式要與存放它的空間的格式匹配。由于磁盤文件中的數(shù)據(jù)是從內(nèi)存中結(jié)構(gòu)體數(shù)組元素得來的,因此它仍然保留結(jié)構(gòu)體元素的數(shù)據(jù)格式?,F(xiàn)在再讀入內(nèi)存,存放在同樣的結(jié)構(gòu)體數(shù)組中,這必然是匹配的。如果把它放到一個整型數(shù)組中,就不匹配了,會出錯。

與文件指針有關(guān)的流成員函數(shù)

在磁盤文件中有一個文件指針,用來指明當前應進行讀寫的位置。在輸入時每讀入 一個宇節(jié),指針就向后移動一個字節(jié)。在輸出時每向文件輸出一個字節(jié),指針就向后移動 一個字節(jié),隨著輸出文件中字節(jié)不斷增加,指針不斷后移。對于二進制文件,允許對指針進行控制,使它按用戶的意圖移動到所需的位置,以便在該位置上進行讀寫。文件流提供 一些有關(guān)文件指針的成員函數(shù)。為了查閱方便,將它們歸納為下表:

詳解C++編程中對二進制文件的讀寫操作

幾點說明:

1) 這些函數(shù)名的第一個字母或最后一個字母不是g就是p。帶 g的是用于輸入的函數(shù)(g是get的第一個字母,以g作為輸入的標識,容易理解和記憶), 帶p的是用于輸出的函數(shù)(P是put的第一個字母,以P作為輸出的標識)。例如有兩個 tell 函數(shù),tellg用于輸入文件,tellp用于輸出文件。同樣,seekg用于輸入文件,seekp用于輸出文件。以上函數(shù)見名知意,一看就明白,不必死記。

如果是既可輸入又可輸出的文件,則任意用seekg或seekp。

2) 函數(shù)參數(shù)中的“文件中的位置”和“位移量”已被指定為long型整數(shù),以字節(jié)為單位。“參照位置”可以是下面三者之一:

ios::beg 文件開頭(beg是begin的縮寫),這是默認值。

ios::cur 指針當前的位置(cur是current的縮寫)。

ios::end 文件末尾。

它們是在ios類中定義的枚舉常量。舉例如下:

infile.seekg(100); //輸入文件中的指針向前移到字節(jié)位置

infile.seekg(-50,ios::cur); //輸入文件中的指針從當前位置后移字節(jié)

outfile.seekp(-75,ios::end); //輸出文件中的指針從文件尾后移字節(jié)

隨機訪問二進制數(shù)據(jù)文件

一般情況下讀寫是順序進行的,即逐個字節(jié)進行讀寫。但是對于二進制數(shù)據(jù)文件來說,可以利用上面的成員函數(shù)移動指針,隨機地訪問文件中任一位置上的數(shù)據(jù),還可以修改文件中的內(nèi)容。

[例] 有個學生的數(shù)據(jù),要求:

把它們存到磁盤文件中;

將磁盤文件中的第,3,5個學生數(shù)據(jù)讀入程序,并顯示出來;

將第個學生的數(shù)據(jù)修改后存回磁盤文件中的原有位置。

從磁盤文件讀入修改后的個學生的數(shù)據(jù)并顯示出來。

要實現(xiàn)以上要求,需要解決個問題:

由于同一磁盤文件在程序中需要頻繁地進行輸入和輸出,因此可將文件的工作方式指定為輸入輸出文件,即ios::in|ios::out|ios::binary。

正確計算好每次訪問時指針的定位,即正確使用seekg或seekp函數(shù)。

正確進行文件中數(shù)據(jù)的重寫(更新)。

可寫出以下程序:

 

 
  1. #include <fstream> 
  2. using namespace std; 
  3. struct student 
  4. int num; 
  5. char name[20]; 
  6. float score; 
  7. }; 
  8. int main( ) 
  9. student stud[5]={1001,"Li",85,1002,"Fun",97.5,1004,"Wang",54,1006,"Tan",76.5,1010,"ling",96}; 
  10. fstream iofile("stud.dat",ios::in|ios::out|ios::binary); 
  11. //用fstream類定義輸入輸出二進制文件流對象iofile 
  12. if(!iofile) 
  13. cerr<<"open error!"<<endl; 
  14. abort( ); 
  15. for(int i=0;i<5;i++) //向磁盤文件輸出個學生的數(shù)據(jù) 
  16. iofile.write((char *)&stud[i],sizeof(stud[i])); 
  17. student stud1[5]; //用來存放從磁盤文件讀入的數(shù)據(jù) 
  18. for(int i=0;i<5;i=i+2) 
  19. iofile.seekg(i*sizeof(stud[i]),ios::beg); //定位于第,2,4學生數(shù)據(jù)開頭 
  20. //先后讀入個學生的數(shù)據(jù),存放在stud1[0],stud[1]和stud[2]中 
  21. iofile.read((char *)&stud1[i/2],sizeof(stud1[0])); 
  22. //輸出stud1[0],stud[1]和stud[2]各成員的值 
  23. cout<<stud1[i/2].num<<" "<<stud1[i/2].name<<" "<<stud1[i/2].score<<endl; 
  24. cout<<endl; 
  25. stud[2].num=1012; //修改第個學生(序號為)的數(shù)據(jù) 
  26. strcpy(stud[2].name,"Wu"); 
  27. stud[2].score=60; 
  28. iofile.seekp(2*sizeof(stud[0]),ios::beg); //定位于第個學生數(shù)據(jù)的開頭 
  29. iofile.write((char *)&stud[2],sizeof(stud[2])); //更新第個學生數(shù)據(jù) 
  30. iofile.seekg(0,ios::beg); //重新定位于文件開頭 
  31. for(int i=0;i<5;i++) 
  32. iofile.read((char *)&stud[i],sizeof(stud[i])); //讀入個學生的數(shù)據(jù) 
  33. cout<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score<<endl; 
  34. iofile.close( ); 
  35. return 0; 

運行情況如下:

 

 
  1. 1001 Li 85(第個學生數(shù)據(jù)) 
  2. 1004 Wang 54 (第個學生數(shù)據(jù)) 
  3. 1010 ling 96 (第個學生數(shù)據(jù)) 
  4.  
  5. 1001 Li 85 (輸出修改后個學生數(shù)據(jù)) 
  6. 1002 Fun 97.5 
  7. 1012 Wu 60 (已修改的第個學生數(shù)據(jù)) 
  8. 1006 Tan 76.5 
  9. 1010 ling 96 

本程序也可以將磁盤文件stud.dat先后定義為輸出文件和輸入文件,在結(jié)束第一次的輸出之后關(guān)閉該文件,然后再按輸入方式打開它,輸入完后再關(guān)閉它,然后再按輸出方式打開,再關(guān)閉,再按輸入方式打開它,輸入完后再關(guān)閉。顯然這是很煩瑣和不方便的。 在程序中把它指定為輸入輸出型的二進制文件。這樣,不僅可以向文件添加新的數(shù)據(jù)或讀入數(shù)據(jù),還可以修改(更新)數(shù)據(jù)。利用這些功能,可以實現(xiàn)比較復雜的輸入輸出任務(wù)。

請注意,不能用ifstream或ofstream類定義輸入輸出的二進制文件流對象,而應當用fstream類。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产伦精品一区二区三区千人斩| 亚洲国产欧美精品| 精品婷婷色一区二区三区蜜桃| 国产系列电影在线播放网址| 中文字幕22页| 不卡视频在线观看| 日本一区二区三区免费看| 国产精品亚洲成在人线| 亚洲开心激情| 九热爱视频精品视频| 国产性生活毛片| 国产日韩综合一区二区性色av| 男人天堂2020| caoporen国产精品视频| 欧美日韩一区二区三区在线免费观看| 自拍亚洲色图| 亚洲国产日韩欧美在线99| 国产人成在线观看| 久久99国产精品成人| 欧美极度另类性三渗透| 日本高清视频免费观看| 久久草在线视频| 欧美二三四区| 麻豆视频在线| 日本黄色一区二区三区| 色综合久久久久久久久| 在线免费视频一区二区| 精品国产av一区二区| bl在线肉h视频大尺度| 性史性dvd影片农村毛片| 欧美一区二区三区色| 一本久久精品| av成人 com a| 一级黄色a视频| 成人一区在线看| 国产精品电影久久久久电影网| 欧美自拍视频在线| 国产乱淫av片杨贵妃| 手机在线一区二区三区| 好男人看片在线观看免费观看国语| 色综合久久久久久中文网| 69ww免费视频播放器| 亚洲品质自拍| 亚洲午夜国产成人av电影男同| 国产成人精品免费久久久久| 亚洲精品一区二区三区在线播放| 在线观看免费看片| 欧美国产日韩视频| a级在线免费观看| 99国产精品白浆在线观看免费| 777米奇影视第四色| 久久久久久久久久网站| 无码毛片aaa在线| 精品美女视频| 日本在线观看a| 欧美丰满老妇| 51精品国产黑色丝袜高跟鞋| 乐播av一区二区三区| 99久久久免费精品| 欧美激情精品久久久久| 国产在线2020| 亚洲精品久久久久国产| 美女av免费在线观看| 日韩视频一区二区三区在线播放| 中字幕一区二区三区乱码| 日本黄色网址大全| 日韩精品国产欧美| 久久黄色免费视频| 综合伊思人在钱三区| 欧美福利小视频| 只有精品亚洲| 中文字幕欧美在线| 成人在线观看免费完整| 国产在线视频2019最新视频| www成人免费| 欧美一区永久视频免费观看| 老色鬼久久亚洲一区二区| 国产欧美自拍一区| 亚洲精品电影院| 国产免费不卡av| 日韩欧美国产片| 精品国产91久久久久久| 国产亚洲精品一区二区| 精品在线观看一区二区| 老司机av在线免费看| 欧美成人高清在线| 一区二区三区四区乱视频| 97在线免费公开视频| 激情亚洲另类图片区小说区| 亚洲精品免费一区亚洲精品免费精品一区| 免费观看v片在线观看| 欧美性受xxxxxx黑人xyx性爽| 久久91亚洲| 精品国产乱码久久久久久影片| 青草在线视频在线观看| 日批视频在线免费看| 国产午夜麻豆影院在线观看| 免费毛片aaaaaa| 欧美女同一区| 亚洲一区精品视频| 国内外成人免费激情视频| 免费看又黄又无码的网站| 日韩一区视频在线| av在线一区二区三区| 欧美区高清在线| 天天看片天天操| 国产91av在线| 久久99国产精品久久99大师| 久久色成人在线| 一本色道久久综合亚洲精品婷婷| 国产精品久久久亚洲一区| 国产精品一区二区欧美黑人喷潮水| 国产精品综合| 黄色一级片免费在线观看| 黄色免费大全亚洲| 蜜桃视频在线观看视频| 一级毛片aaaaaa免费看| 嫩草影院发布页| 国产视频一区二区三| 自拍视频亚洲| 欧美午夜aaaaaa免费视频| 天堂网在线.www天堂在线| 国产在线不卡一卡二卡三卡四卡| 国产偷国产偷亚洲清高网站| 97av影视网在线观看| 任我爽在线视频精品一| 全部av―极品视觉盛宴亚洲| 免费视频爱爱太爽了| 高清在线观看免费韩剧| 久久精品国产免费看久久精品| 成年人午夜剧场| 少妇一区视频| 日韩成人三级| 国产精品密蕾丝视频下载| 狠狠色一日本高清视频| 亚洲福中文字幕伊人影院| 青春草视频在线观看| 激情欧美一区二区三区| 色在线中文字幕| 亚洲精品在线二区| 91久久精品午夜一区二区| 成年人在线免费看片| 成年片费网站色大全免费视频| 亚洲第一会所001| 青春有你2免费观看完整版在线播放高清| 91黄视频在线观看| 国产a久久麻豆| 嫩草影院懂你的影院| 国产人成视频在线观看| 高清一区二区中文字幕| 国产精品偷伦一区二区| 一区二区三区欧美亚洲| 欧美另类69精品久久久久9999| 成年网在线观看免费观看网址| 精品淫伦v久久水蜜桃| 亚洲成人三级在线| 国内精品伊人久久久久av一坑| 亚洲欧洲在线视频| 精品无码一区二区三区蜜臀| 91免费电影网站| 2019中文字幕在线视频| 严阵以待中文社区| 成人黄色免费网站在线观看| 亚洲最大成人综合| 97涩在线观看视频| 亚洲免费在线精品一区| 亚欧无线一线二线三线区别| 亚洲成人精品久久久| 日本一二三区不卡| 水蜜桃一区二区| 欧美丝袜丝交足nylons| 无需播放器亚洲| 天天操天天干天天玩| 亚洲国产精品成人综合| 精人妻一区二区三区| av日韩免费电影| 亚洲人成伊人成综合图片| 成人亚洲综合天堂| 自拍视频一区二区| 男女毛片免费视频看| 99在线免费视频| 永久免费看mv网站入口78| 91tv官网精品成人亚洲| 奇米777欧美一区二区| 久久白虎精品| 欧洲日韩一区二区三区| 亚洲欧美自拍视频| av日韩精品| 国语对白精品一区二区| 欧美性xxxxx极品| 久久全球大尺度高清视频| 66m—66摸成人免费视频| 成人免费区一区二区三区| 麻豆91小视频| 三级黄色片免费看| freesex欧美| 国产日韩在线免费| 亚洲黄色小视频| 成人污版视频| 久久久久久久福利| 中文字幕久热精品视频在线| 一区二区在线| 97久久网站| 91精品久久久久久蜜桃| 伊人久久大香线蕉精品组织观看| 制服丝袜亚洲播放| 国产无遮挡裸体免费视频| 99久久免费国| 亚洲午夜精品久久久中文影院av| 91午夜精品亚洲一区二区三区| 91成人高清| 天天噜天天色| www.久久国产| 成人免费网站www网站高清| 欧美精品做受xxx性少妇| 国产高清精品久久久久| 亚欧激情乱码久久久久久久久| 国产三级精品在线观看| 欧美视频二区36p| 91精品视频一区| 一级黄色录像免费看| 日韩av激情| 久久永久免费视频| 欧美极品第一页| 国产精品诱惑| 国产亚洲成人av| 久久综合九色综合久99| 91黄色在线| 久久一区二区视频| 亚洲一区欧美在线| 自拍偷拍亚洲色图欧美| 黄色漫画在线免费看| 91亚洲国产成人久久精品网站| 国产成人精品综合网站| 久久深夜福利| 国产精品国内免费一区二区三区| 欧美日韩一区二区三区不卡视频| av在线不卡网| 成年人视频在线观看免费| 精品一二线国产| 国产欧美短视频| 亚洲另类自拍| 日本久久久a级免费| 国产视频精品网| 精品少妇一区二区三区在线视频| 爱情岛论坛亚洲首页入口章节| 伊人影院蕉久影院在线观看| 欧美精品v国产精品v日韩精品| www成人免费观看| 中文天堂在线一区| 在线中文字日产幕| 中文字幕在线不卡一区二区三区| 久久精品亚洲人成影院| 国产一区二区三区视频在线| 欧美熟妇精品黑人巨大一二三区| 国新精品乱码一区二区三区18| 视频一区视频二区中文| 草莓视频18免费观看| caoporm在线视频| 四虎在线免费观看| 国产大片免费看| 精品人妻人人做人人爽夜夜爽| 欧美福利视频网站| 久久99热狠狠色一区二区| 久久av中文字幕| 久久久久久电影| 国产成人av在线播放| 日韩欧美中文字幕一区二区| h网站免费观看| 国产精品久久..4399| 网曝91综合精品门事件在线| 中文字幕免费在线视频| 韩国av一区二区三区在线观看| 国产又粗又猛又爽又黄| 欧美做受高潮6| 国产黄在线播放| 黄色片中文字幕| 久久精品国产精品亚洲红杏| 午夜精品福利在线视频| 国产精品久久久久一区二区三区| 久久久精品影视| 尤物九九久久国产精品的分类| 欧美揉bbbbb揉bbbbb| 国模私拍视频一区| 欧美日韩三级一区| 国产精品亚洲欧美导航| 青青草在线免费视频| 777琪琪电影午夜理伦片| 久久久久亚洲精品成人网小说| 一区二区三区精彩视频| 国产精品久久久久7777按摩| 国产午夜精品在线| 久久草在线看| 一本一本久久a久久综合精品蜜桃| 黄色一级片免费在线观看| 极品白浆推特女神在线观看| 九色91porny| 免费在线观看视频| 黄色av网站在线看| 亚洲免费不卡| 欧美三级特黄| 日韩av免费网址| 亚洲成人av影片| 成人做爰视频www| 国产精品久久久久久麻豆一区软件| 在线国产三级| 色se01短视频永久免费| 亚洲人妻一区二区| 亚洲欧美综合另类| av在线麻豆| 老太做爰xxxx| 国产精品美女www爽爽爽视频| 国产污视频在线看| 50路60路老熟妇啪啪| 亚洲国产一区二区精品专区| 精精国产xxxx视频在线野外| 亚洲熟妇无码久久精品| 成人免费乱码大片a毛片软件| 蜜桃在线一区| 国产黄片一区二区三区| 精品视频一区二区三区四区五区| 欧美4khd| 在线观看高清免费视频| 成人网18免费网站| 在线一级视频| 高清av一区二区| 午夜伊人狠狠久久| 日韩高清av电影|