最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++用read()和write()讀寫二進(jìn)制文件的超詳細(xì)教程

 更新時(shí)間:2022年06月07日 10:32:45   作者:睿科知識云  
二進(jìn)制的文件肉眼我們是讀不懂的,如果通過二進(jìn)制的讀寫操作就可以讀懂,下面這篇文章主要給大家介紹了關(guān)于C++用read()和write()讀寫二進(jìn)制文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

通過前一節(jié)的學(xué)習(xí),讀者了解了以文本形式讀寫文件和以二進(jìn)制形式讀寫文件的區(qū)別,并掌握了用重載的 >> 和 << 運(yùn)算符實(shí)現(xiàn)以文本形式讀寫文件。在此基礎(chǔ)上,本節(jié)繼續(xù)講解如何以二進(jìn)制形式讀寫文件。

不過介紹具體的實(shí)現(xiàn)方法前,先給讀者介紹一下相比以文本形式讀寫文件,以二進(jìn)制形式讀寫文件有哪些好處?

舉個(gè)例子,現(xiàn)在要做一個(gè)學(xué)籍管理程序,其中一個(gè)重要的工作就是記錄學(xué)生的學(xué)號、姓名、年齡等信息。這意味著,我們需要用一個(gè)類來表示學(xué)生,如下所示:

class CStudent
{
    char szName[20];  //假設(shè)學(xué)生姓名不超過19個(gè)字符,以 '\0' 結(jié)尾
    char szId[l0];  //假設(shè)學(xué)號為9位,以 '\0' 結(jié)尾
    int age;  //年齡
};

前面章節(jié)中,我們學(xué)會了如何以文本形式讀寫文件,如果使用此方式存儲學(xué)生的信息,則最終的文件中存儲的學(xué)生信息可能是這個(gè)樣子:

Micheal Jackson 110923412 17
Tom Hanks 110923413 18

要知道,這種存儲學(xué)生信息的方式不但浪費(fèi)空間,而且后期不利于查找指定學(xué)生的信息(查找效率低下),因?yàn)槊總€(gè)學(xué)生的信息所占用的字節(jié)數(shù)不同。

這種情況下,以二進(jìn)制形式將學(xué)生信息存儲到文件中,是非常不錯(cuò)的選擇,因?yàn)橐源诵问酱鎯W(xué)生信息,可以直接把 CStudent 對象寫入文件中,這意味著每個(gè)學(xué)生的信息都只占用 sizeof(CStudent) 個(gè)字節(jié)。

值得一提的是,要實(shí)現(xiàn)以二進(jìn)制形式讀寫文件,<< 和 >> 將不再適用,需要使用 C++ 標(biāo)準(zhǔn)庫專門提供的 read() 和 write() 成員方法。其中,read() 方法用于以二進(jìn)制形式從文件中讀取數(shù)據(jù);write() 方法用于以二進(jìn)制形式將數(shù)據(jù)寫入文件。

C++ ostream::write()方法寫文件

ofstream 和 fstream 的 write() 成員方法實(shí)際上繼承自 ostream 類,其功能是將內(nèi)存中 buffer 指向的 count 個(gè)字節(jié)的內(nèi)容寫入文件,基本格式如下:

ostream & write(char* buffer, int count);

其中,buffer 用于指定要寫入文件的二進(jìn)制數(shù)據(jù)的起始位置;count 用于指定寫入字節(jié)的個(gè)數(shù)。

也就是說,該方法可以被 ostream 類的 cout 對象調(diào)用,常用于向屏幕上輸出字符串。同時(shí),它還可以被 ofstream 或者 fstream 對象調(diào)用,用于將指定個(gè)數(shù)的二進(jìn)制數(shù)據(jù)寫入文件。

同時(shí),該方法會返回一個(gè)作用于該函數(shù)的引用形式的對象。舉個(gè)例子,obj.write() 方法的返回值就是對 obj 對象的引用。

需要注意的一點(diǎn)是,write() 成員方法向文件中寫入若干字節(jié),可是調(diào)用 write() 函數(shù)時(shí)并沒有指定這些字節(jié)寫入文件中的具體位置。事實(shí)上,write() 方法會從文件寫指針指向的位置將二進(jìn)制數(shù)據(jù)寫入。所謂文件寫指針,是是 ofstream 或 fstream 對象內(nèi)部維護(hù)的一個(gè)變量,文件剛打開時(shí),文件寫指針指向的是文件的開頭(如果以 ios::app 方式打開,則指向文件末尾),用 write() 方法寫入 n 個(gè)字節(jié),寫指針指向的位置就向后移動(dòng) n 個(gè)字節(jié)。

下面的程序演示了如何將學(xué)生信息以二進(jìn)制形式寫入文件:

#include <iostream>
#include <fstream>
using namespace std;
class CStudent
{
public:
    char szName[20];
    int age;
};
int main()
{
    CStudent s;
    ofstream outFile("students.dat", ios::out | ios::binary);
    while (cin >> s.szName >> s.age)
        outFile.write((char*)&s, sizeof(s));
    outFile.close();
    return 0;
}

輸入:

Tom 60↙
Jack 80↙
Jane 40↙
^Z↙

其中,↙表示輸出換行符,^Z 表示輸入Ctrl+Z組合鍵結(jié)束輸入。

執(zhí)行程序后,會自動(dòng)生成一個(gè) students.dat 文件,其內(nèi)部存有 72 字節(jié)的數(shù)據(jù),如果用“記事本”打開此文件,可能看到如下亂碼:

Tom 燙燙燙燙燙燙燙燙<   Jack 燙燙燙燙燙燙燙蘌   Jane 燙燙燙燙燙燙燙?

值得一提的是,程序中第 13 行指定文件的打開模式為 ios::out | ios::binary,即以二進(jìn)制寫模式打開。在 Windows平臺中,以二進(jìn)制模式打開文件是非常有必要的,否則可能出錯(cuò)。

另外,第 15 行將 s 對象寫入文件。s 的地址就是要寫入文件的內(nèi)存緩沖區(qū)的地址,但是 &s 不是 char * 類型,因此要進(jìn)行強(qiáng)制類型轉(zhuǎn)換;第 16 行,文件使用完畢一定要關(guān)閉,否則程序結(jié)束后文件的內(nèi)容可能不完整。

C++ istream::read()方法讀文件

ifstream 和 fstream 的 read() 方法實(shí)際上繼承自 istream 類,其功能正好和 write() 方法相反,即從文件中讀取 count 個(gè)字節(jié)的數(shù)據(jù)。該方法的語法格式如下:

istream & read(char* buffer, int count);

其中,buffer 用于指定讀取字節(jié)的起始位置,count 指定讀取字節(jié)的個(gè)數(shù)。同樣,該方法也會返回一個(gè)調(diào)用該方法的對象的引用。

和 write() 方法類似,read() 方法從文件讀指針指向的位置開始讀取若干字節(jié)。所謂文件讀指針,可以理解為是 ifstream 或 fstream 對象內(nèi)部維護(hù)的一個(gè)變量。文件剛打開時(shí),文件讀指針指向文件的開頭(如果以 ios::app 方式打開,則指向文件末尾),用 read() 方法讀取 n 個(gè)字節(jié),讀指針指向的位置就向后移動(dòng) n 個(gè)字節(jié)。因此,打開一個(gè)文件后連續(xù)調(diào)用 read() 方法,就能將整個(gè)文件的內(nèi)容讀取出來。

通過執(zhí)行 write() 方法的示例程序,我們將 3 個(gè)學(xué)生的信息存儲到了 students.dat 文件中,下面程序演示了如何使用 read() 方法將它們讀取出來:

#include <iostream>
#include <fstream>
using namespace std;
class CStudent
{
public:
    char szName[20];
    int age;
};
int main()
{
    CStudent s;       
    ifstream inFile("students.dat",ios::in|ios::binary); //二進(jìn)制讀方式打開
    if(!inFile) {
        cout << "error" <<endl;
        return 0;
    }
    while(inFile.read((char *)&s, sizeof(s))) { //一直讀到文件結(jié)束
        cout << s.szName << " " << s.age << endl;   
    }
    inFile.close();
    return 0;
}

程序的輸出結(jié)果是:

Tom 60
Jack 80
Jane 40

注意,程序中第 18 行直接將 read() 方法作為 while 循環(huán)的判斷條件,這意味著,read() 方法會一直讀取到文件的末尾,將所有字節(jié)全部讀取完畢,while 循環(huán)才會終止。

另外,在使用 read() 方法的同時(shí),如果想知道一共成功讀取了多少個(gè)字節(jié)(讀到文件尾時(shí),未必能讀取 count 個(gè)字節(jié)),可以在 read() 方法執(zhí)行后立即調(diào)用文件流對象的 gcount() 成員方法,其返回值就是最近一次 read() 方法成功讀取的字節(jié)數(shù)。感興趣的讀者可自行嘗試,這里不再做具體演示。

總結(jié)

到此這篇關(guān)于C++用read()和write()讀寫二進(jìn)制文件的文章就介紹到這了,更多相關(guān)C++ read()和write()讀寫二進(jìn)制文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • QT編寫窗口插件實(shí)現(xiàn)調(diào)用窗口的自適應(yīng)

    QT編寫窗口插件實(shí)現(xiàn)調(diào)用窗口的自適應(yīng)

    這篇文章主要為大家詳細(xì)介紹了QT編寫窗口插件實(shí)現(xiàn)調(diào)用窗口的自適應(yīng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • c++ 類成員變量默認(rèn)初始值的實(shí)現(xiàn)

    c++ 類成員變量默認(rèn)初始值的實(shí)現(xiàn)

    本文主要介紹了c++ 類成員變量默認(rèn)初始值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-07-07
  • C語言由淺入深講解文件的操作下篇

    C語言由淺入深講解文件的操作下篇

    C語言具有操作文件的能力,比如打開文件、讀取和追加數(shù)據(jù)、插入和刪除數(shù)據(jù)、關(guān)閉文件、刪除文件等。與其他編程語言相比,C語言文件操作的接口相當(dāng)簡單和易學(xué)
    2022-04-04
  • Qt MQTT開發(fā)環(huán)境搭建的實(shí)現(xiàn)示例

    Qt MQTT開發(fā)環(huán)境搭建的實(shí)現(xiàn)示例

    本文主要介紹了Qt MQTT開發(fā)環(huán)境搭建的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解C語言基礎(chǔ)的類型轉(zhuǎn)換

    詳解C語言基礎(chǔ)的類型轉(zhuǎn)換

    這篇文章主要為大家介紹了C語言基礎(chǔ)的類型轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C語言冷門知識之你可能沒聽過的柔性數(shù)組

    C語言冷門知識之你可能沒聽過的柔性數(shù)組

    柔性數(shù)組(Flexible Array)是引入的一個(gè)新特性,它允許你在定義結(jié)構(gòu)體時(shí)創(chuàng)建一個(gè)空數(shù)組,而這個(gè)數(shù)組的大小可以在程序運(yùn)行的過程中根據(jù)你的需求進(jìn)行更改特別注意的一點(diǎn)是:這個(gè)空數(shù)組必須聲明為結(jié)構(gòu)體的最后一個(gè)成員,并且還要求這樣的結(jié)構(gòu)體至少包含一個(gè)其他類型的成員
    2021-10-10
  • C++異常處理從基礎(chǔ)到應(yīng)用全面解析

    C++異常處理從基礎(chǔ)到應(yīng)用全面解析

    C/C++異常處理是一個(gè)關(guān)鍵的主題,特別是在這兩種廣泛使用的編程語言中,它們提供了處理程序運(yùn)行期間遇到的非正常情況的能力,這篇文章主要介紹了C++異常處理從基礎(chǔ)到應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2025-11-11
  • 基于VC編寫COM連接點(diǎn)事件的分析介紹

    基于VC編寫COM連接點(diǎn)事件的分析介紹

    本篇文章是對VC編寫COM連接點(diǎn)事件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Clion配置opencv開發(fā)環(huán)境的詳細(xì)過程

    Clion配置opencv開發(fā)環(huán)境的詳細(xì)過程

    這篇文章主要介紹了Clion配置opencv開發(fā)環(huán)境的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考的下
    2022-04-04
  • c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式

    c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式

    這篇文章主要介紹了c++將vector迭代器轉(zhuǎn)換為指針的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

南汇区| 安塞县| 黄龙县| 星子县| 章丘市| 汉寿县| 甘肃省| 青海省| 海安县| 沁阳市| 社旗县| 林州市| 金溪县| 万安县| 台州市| 大庆市| 宿迁市| 广平县| 基隆市| 礼泉县| 上思县| 绥化市| 文安县| 黄龙县| 高邮市| 汝阳县| 南部县| 宿松县| 平山县| 海门市| 湘潭市| 寻乌县| 平原县| 文安县| 庄浪县| 金沙县| 吉林市| 桑日县| 靖宇县| 若尔盖县| 洪湖市|