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

C語言文件操作之fread函數詳解

 更新時間:2022年06月14日 09:10:41   作者:韓曙亮  
fread()函數用來從指定文件中讀取塊數據,下面這篇文章主要給大家介紹了關于C語言文件操作之fread函數的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

二進制文件讀寫兩個重要的函數 , fread 和 fwrite , fread 用于讀取文件 , fwrite 用于寫出文件 ;

fread / fwrite 函數 既可以操作 二進制文件 , 又可以操作 文本文件 ;

getc / putc 函數 , fscanf / fprintf 函數 , fgets / fgets 函數 , 只能用于操作 文本文件 ;

一、fread 函數

fread 函數作用 : 從文件中讀取若干字節(jié)數據到內存緩沖區(qū)中 ;

fread 函數原型 :

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

void *buffer 參數 : 將文件中的二進制數據讀取到該緩沖區(qū)中 ;

size_t size 參數 : 讀取的 基本單元 字節(jié)大小 , 單位是字節(jié) , 一般是 buffer 緩沖的單位大小 ;

  • 如果 buffer 緩沖區(qū)是 char 數組 , 則該參數的值是 sizeof(char) ;
  • 如果 buffer 緩沖區(qū)是 int 數組 , 則該參數的值是 sizeof(int) ;

size_t count 參數 : 讀取的 基本單元 個數 ;

FILE *stream 參數 : 文件指針 ;

size_t 返回值 : 實際從文件中讀取的 基本單元 個數 ; 讀取的字節(jié)數是 基本單元數 * 基本單元字節(jié)大小 ;

代碼示例 : 一次性讀滿整個緩沖區(qū) ;

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[1024] = {0};

    // buffer : 將文件讀取到內存的位置
    // sizeof(char) : 讀取的基本單元字節(jié)長度
    // sizeof(buffer) : 讀取的基本單元個數,
    //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
    // p : 文件指針
    fread(buffer, sizeof(char), sizeof(buffer), p);

    // 打印讀取的內容
    printf("buffer = %s\n", buffer);

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 :

二、緩沖區(qū)受限的情況 ( 循環(huán)讀取文件 | feof 函數判定文件讀取完畢 )

假設緩沖區(qū)很小 , 文件很大 , 則需要循環(huán)讀取文件數據 ;

使用 feof(p) 判定文件是否讀取完畢 , 如果返回 true 說明文件沒有讀取完畢 , 返回 false , 說明文件讀取完畢 ;

代碼示例 :

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[4] = {0};

    while(!feof(p)){
        memset(buffer, 0, sizeof(buffer));
        // buffer : 將文件讀取到內存的位置
        // sizeof(char) : 讀取的基本單元字節(jié)長度
        // sizeof(buffer) : 讀取的基本單元個數,
        //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
        // p : 文件指針
        fread(buffer, sizeof(char), sizeof(buffer), p);

        // 打印讀取的內容
        printf("buffer = %s\n", buffer);
    }

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 : 讀取之后出現亂碼 , 這是由于每次讀取 10 10 10 字節(jié) , 但是字符串必須要以 ‘\0’ 進行結尾 , 如果沒有 ‘\0’ 則會一直讀取直到出現 ‘\0’ 字符串結尾位置 ;

三、處理亂碼問題

為了避免上述打印出現亂碼的情況 , char buffer[4] = {0}; 準備了 4 4 4 字節(jié)緩沖區(qū) , 每次只使用其中的 3 3 3 個字節(jié) , 這就能保證最后一個字節(jié)必定是 ‘\0’ , 打印時就不會出現亂碼 ;

代碼示例 :

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[4] = {0};

    while(!feof(p)){
        memset(buffer, 0, sizeof(buffer));
        // buffer : 將文件讀取到內存的位置
        // sizeof(char) : 讀取的基本單元字節(jié)長度
        // sizeof(buffer) : 讀取的基本單元個數,
        //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
        // p : 文件指針
        fread(buffer, sizeof(char), sizeof(buffer) - 1, p);

        // 打印讀取的內容
        printf("buffer = %s\n", buffer);
    }

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 : 每次從文件中讀取 緩沖區(qū)字節(jié)數 - 1 個字節(jié) , 則能完整的將文本打印出來 ;

四、記錄讀取的字節(jié)個數

fread 函數返回值表示讀取到的 基本單元 的個數 , 如果設置了 1KB 的緩沖區(qū) , 但是文件中只有 5 字節(jié) , 則 fread 的返回值就是實際讀取到的數據個數 ;

代碼示例 :

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[1024] = {0};
    // buffer : 將文件讀取到內存的位置
    // sizeof(char) : 讀取的基本單元字節(jié)長度
    // sizeof(buffer) : 讀取的基本單元個數,
    //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
    // p : 文件指針
    // 返回值 : fread 函數返回值表示讀取到的 基本單元 的個數
    size_t count = fread(buffer, sizeof(char), sizeof(buffer) - 1, p);

    // 打印讀取的內容
    printf("buffer = %s , read count = %u\n", buffer, count);

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 :

五、讀取到 0 字節(jié)的情況

如果 基本單元 大小 4 4 4 字節(jié) , 文件中只有 3 3 3 字節(jié)數據 , 則使用 fread 函數讀取文件 , 緩沖區(qū)設置 1KB , 則實際讀取到的基本單元個數是 0 0 0 ;

代碼示例 :

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[1024] = {0};
    // buffer : 將文件讀取到內存的位置
    // sizeof(char) : 讀取的基本單元字節(jié)長度
    // sizeof(buffer) : 讀取的基本單元個數,
    //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
    // p : 文件指針
    // 返回值 : fread 函數返回值表示讀取到的 基本單元 的個數
    size_t count = fread(buffer, sizeof(int), sizeof(buffer) - 1, p);

    // 打印讀取的內容
    printf("buffer = %s , read count = %u\n", buffer, count);

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 :

六、讀取完畢的情況

如果文件已經讀取完畢 , 不關閉文件 , 再次調用 fread 函數繼續(xù)讀取 , 則讀取到的 基本單元 個數是 0 0 0 ;

使用 feof(p) 判定文件是否讀取完畢 , 如果返回 true 說明文件沒有讀取完畢 , 返回 false , 說明文件讀取完畢 ;

代碼示例 :

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[1024] = {0};
    // buffer : 將文件讀取到內存的位置
    // sizeof(char) : 讀取的基本單元字節(jié)長度
    // sizeof(buffer) : 讀取的基本單元個數,
    //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
    // p : 文件指針
    // 返回值 : fread 函數返回值表示讀取到的 基本單元 的個數
    size_t count = fread(buffer, sizeof(char), sizeof(buffer) - 1, p);

    // 打印第一次讀取的內容
    printf("First fread : buffer = %s , read count = %u\n", buffer, count);

    count = fread(buffer, sizeof(int), sizeof(buffer) - 1, p);

    // 打印第二次讀取的內容
    printf("Second fread : buffer = %s , read count = %u\n", buffer, count);

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 :

七、讀取文本文件 “\n” 與 讀取二進制文件 “\r\n” 區(qū)別

以下區(qū)別只在 Windows 系統(tǒng)存在 , 在 Linux / Unix 中讀取文本數據與二進制數據沒有區(qū)別 ;

使用 ‘rb’ 方式打開文件 , 讀取二進制文件 , 然后調用 fread 函數讀取文件 ,

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "rb");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[1024] = {0};
    // buffer : 將文件讀取到內存的位置
    // sizeof(char) : 讀取的基本單元字節(jié)長度
    // sizeof(buffer) : 讀取的基本單元個數,
    //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
    // p : 文件指針
    // 返回值 : fread 函數返回值表示讀取到的 基本單元 的個數
    size_t count = fread(buffer, sizeof(char), sizeof(buffer) - 1, p);

    // 打印第一次讀取的內容
    printf("fread : buffer = %s , read count = %u\n", buffer, count);

    // 逐個字節(jié)打印讀取出數據的 ASCII 碼
    int i = 0;
    for(i = 0; i < count; i ++){
        printf("buffer[%d] = %x\n", i, buffer[i]);
    }

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 : 第 2 2 2 個索引讀取出來的值是 0xd 對應 ‘\r’ , 第 3 3 3 個值是 0xa 對應 ‘\n’ ;

注意 : 最后兩個字節(jié)是空行對應的 “\r\n” ;

fread : buffer = ab
cd
 , read count = 8
buffer[0] = 61
buffer[1] = 62
buffer[2] = d
buffer[3] = a
buffer[4] = 63
buffer[5] = 64
buffer[6] = d
buffer[7] = a
Main End

使用 ‘r’ 方式打開文件 , 讀取文本文件 , 然后調用 fread 函數讀取文件 ,

#include <stdio.h>

int main()
{
    // 使用 "rb" 讀取二進制方式打開文件
    FILE *p = fopen("D:\\a.txt", "r");

    // 用于接收讀取數據的緩沖區(qū)
    char buffer[1024] = {0};
    // buffer : 將文件讀取到內存的位置
    // sizeof(char) : 讀取的基本單元字節(jié)長度
    // sizeof(buffer) : 讀取的基本單元個數,
    //       讀取字節(jié)個數是 sizeof(buffer) * sizeof(char)
    // p : 文件指針
    // 返回值 : fread 函數返回值表示讀取到的 基本單元 的個數
    size_t count = fread(buffer, sizeof(char), sizeof(buffer) - 1, p);

    // 打印第一次讀取的內容
    printf("fread : buffer = %s , read count = %u\n", buffer, count);

    // 逐個字節(jié)打印讀取出數據的 ASCII 碼
    int i = 0;
    for(i = 0; i < count; i ++){
        printf("buffer[%d] = %x\n", i, buffer[i]);
    }

    printf("Main End\n");
    return 0;
}

執(zhí)行結果 : 第 2 2 2 個索引讀取出來的值是 0xa 對應 ‘\n’ ;

最后的空行只有一個 ‘\n’ ;

fread : buffer = ab
cd
 , read count = 6
buffer[0] = 61
buffer[1] = 62
buffer[2] = a
buffer[3] = 63
buffer[4] = 64
buffer[5] = a
Main End

總結 

到此這篇關于C語言文件操作之fread函數的文章就介紹到這了,更多相關C語言文件操作fread函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言排序算法之插入排序

    C語言排序算法之插入排序

    這篇文章主要為大家詳細介紹了C語言排序算法之插入排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • c++中比較好用的“黑科技”

    c++中比較好用的“黑科技”

    這篇文章主要介紹了c++中比較好用的“黑科技”,一些常用小編沒有給大家羅列出,主要給大家介紹了sort函數,需要的朋友可以參考下
    2020-02-02
  • 淺談c++ hook 鉤子的使用介紹

    淺談c++ hook 鉤子的使用介紹

    本篇文章主要介紹了淺談c++ hook 鉤子的使用介紹,詳細的介紹了c++ hook 鉤子的原理和運行機制,有興趣的可以了解一下
    2017-11-11
  • C++入門之內存處理詳解

    C++入門之內存處理詳解

    這篇文章主要為大家介紹了C++入門之內存處理,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 在C語言編程中使用變量的基礎教程

    在C語言編程中使用變量的基礎教程

    這篇文章主要介紹了在C語言編程中使用變量的基礎教程,特別需要注意C語言中的指針變量,需要的朋友可以參考下
    2016-02-02
  • VS?Code安裝及C、C++環(huán)境配置詳細教程(Windows系統(tǒng))

    VS?Code安裝及C、C++環(huán)境配置詳細教程(Windows系統(tǒng))

    這篇文章主要介紹了VS?Code安裝及C、C++環(huán)境配置詳細教程(Windows系統(tǒng)),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • C語言 詳解字符串基礎

    C語言 詳解字符串基礎

    在 C 語言中,字符串實際上是使用空字符 \0 結尾的一維字符數組。因此,\0 是用于標記字符串的結束??兆址∟ull character)又稱結束符,縮寫 NUL,是一個數值為 0 的控制字符,\0 是轉義字符,意思是告訴編譯器,這不是字符 0,而是空字符
    2022-04-04
  • C++實現STL迭代器萃取的示例代碼

    C++實現STL迭代器萃取的示例代碼

    迭代器是一種抽象的設計概念,它提供了一種方法,使之能夠依序巡訪某個聚合物(容器)所含的各個元素,而又無需暴露該聚合物的內部表述方式。本文主要介了STL迭代器萃取的方法,需要的可以參考一下
    2022-11-11
  • C語言獲得電腦的IP地址的小例子

    C語言獲得電腦的IP地址的小例子

    C語言獲得電腦的IP地址的小例子,需要的朋友可以參考一下
    2013-05-05
  • 解決c++?error:crosses?initialization?of?問題

    解決c++?error:crosses?initialization?of?問題

    最近在寫代碼的時候,碰到了?crosses?initialization?of?...?的問題,只因我在?switch?的某個?case?分支下定義了一個變量,于是乎便將這個問題整理一下,需要的朋友可以參考下
    2023-03-03

最新評論

连城县| 郎溪县| 滕州市| 北川| 荣昌县| 习水县| 察哈| 宜兰县| 平阳县| 定陶县| 蓬莱市| 清镇市| 靖宇县| 延寿县| 达拉特旗| 九龙城区| 阜城县| 静宁县| 保山市| 扬中市| 磴口县| 平远县| 金湖县| 马龙县| 呼和浩特市| 滦南县| 加查县| 光山县| 禹州市| 玛沁县| 灵宝市| 巴南区| 广西| 攀枝花市| 鄂托克旗| 湖州市| 东源县| 大埔区| 新沂市| 军事| 平度市|