欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言文件操作之fread函數(shù)詳解

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

前言

二進(jìn)制文件讀寫兩個(gè)重要的函數(shù) , fread 和 fwrite , fread 用于讀取文件 , fwrite 用于寫出文件 ;

fread / fwrite 函數(shù) 既可以操作 二進(jìn)制文件 , 又可以操作 文本文件 ;

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

一、fread 函數(shù)

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

fread 函數(shù)原型 :

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

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

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

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

size_t count 參數(shù) : 讀取的 基本單元 個(gè)數(shù) ;

FILE *stream 參數(shù) : 文件指針 ;

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

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

#include <stdio.h>

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

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

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

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

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

執(zhí)行結(jié)果 :

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

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

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

代碼示例 :

#include <stdio.h>

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

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

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

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

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

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

三、處理亂碼問題

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

代碼示例 :

#include <stdio.h>

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

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

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

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

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

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

四、記錄讀取的字節(jié)個(gè)數(shù)

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

代碼示例 :

#include <stdio.h>

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

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

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

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

執(zhí)行結(jié)果 :

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

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

代碼示例 :

#include <stdio.h>

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

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

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

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

執(zhí)行結(jié)果 :

六、讀取完畢的情況

如果文件已經(jīng)讀取完畢 , 不關(guān)閉文件 , 再次調(diào)用 fread 函數(shù)繼續(xù)讀取 , 則讀取到的 基本單元 個(gè)數(shù)是 0 0 0 ;

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

代碼示例 :

#include <stdio.h>

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

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

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

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

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

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

執(zhí)行結(jié)果 :

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

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

使用 ‘rb’ 方式打開文件 , 讀取二進(jìn)制文件 , 然后調(diào)用 fread 函數(shù)讀取文件 ,

#include <stdio.h>

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

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

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

    // 逐個(gè)字節(jié)打印讀取出數(shù)據(jù)的 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í)行結(jié)果 : 第 2 2 2 個(gè)索引讀取出來的值是 0xd 對應(yīng) ‘\r’ , 第 3 3 3 個(gè)值是 0xa 對應(yīng) ‘\n’ ;

注意 : 最后兩個(gè)字節(jié)是空行對應(yīng)的 “\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’ 方式打開文件 , 讀取文本文件 , 然后調(diào)用 fread 函數(shù)讀取文件 ,

#include <stdio.h>

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

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

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

    // 逐個(gè)字節(jié)打印讀取出數(shù)據(jù)的 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í)行結(jié)果 : 第 2 2 2 個(gè)索引讀取出來的值是 0xa 對應(yīng) ‘\n’ ;

最后的空行只有一個(gè) ‘\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

總結(jié) 

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

相關(guān)文章

  • Qt 進(jìn)度條的實(shí)現(xiàn)示例

    Qt 進(jìn)度條的實(shí)現(xiàn)示例

    進(jìn)度條在很多時(shí)候都可以用到,有時(shí)我們需要在表格,樹狀欄中直觀顯示任務(wù)進(jìn)度或消耗百分比,本文就詳細(xì)的介紹一下Qt 進(jìn)度條的使用實(shí)例,感興趣的可以了解一下
    2021-06-06
  • C語言轉(zhuǎn)義字符實(shí)例詳解

    C語言轉(zhuǎn)義字符實(shí)例詳解

    這里主要介紹了C語言的轉(zhuǎn)義字符的知識,并附有示例代碼,以便理解,希望對學(xué)習(xí) C語言的同學(xué)有所幫助
    2016-07-07
  • C++17中std::string_view的使用

    C++17中std::string_view的使用

    std::string_view是C++17標(biāo)準(zhǔn)庫中的一種新類型,它提供了對一個(gè)字符序列的非擁有式視圖,本文主要介紹了C++17中std::string_view的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • 使用C++制作GC Server過程詳解

    使用C++制作GC Server過程詳解

    這篇文章主要介紹了使用C++制作GC Server過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • C語言算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    C語言算法的時(shí)間復(fù)雜度和空間復(fù)雜度

    這篇文章主要介紹了C語言算法的時(shí)間復(fù)雜度和空間復(fù)雜度,算法在編寫成可執(zhí)行程序后,運(yùn)行時(shí)需要耗費(fèi)時(shí)間資源和空間(內(nèi)存)資源,更多相關(guān)需要的朋友可以參考一下
    2022-07-07
  • C語言實(shí)現(xiàn)隨機(jī)搶紅包功能

    C語言實(shí)現(xiàn)隨機(jī)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)隨機(jī)搶紅包功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 基于C++實(shí)現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)

    基于C++實(shí)現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)

    本文的主要思想是Kinect SDK 讀取彩色、深度、骨骼信息并用OpenCV顯示,非常的實(shí)用,有需要的小伙伴可以參考下
    2015-12-12
  • 如何寫出優(yōu)美的C語言代碼

    如何寫出優(yōu)美的C語言代碼

    今天小編就為大家分享一篇關(guān)于如何寫出優(yōu)美的C語言代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持(下)

    C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持(下)

    這篇文章主要介紹的是 C++ 多線程編程建議之 C++ 對多線程/并發(fā)的支持的相關(guān)資料,承接前文 現(xiàn)代 C++ 對多線程/并發(fā)的支持,接下來我們看看回發(fā)生什么吧
    2021-10-10
  • C++中的函數(shù)返回值與拷貝用法

    C++中的函數(shù)返回值與拷貝用法

    這篇文章主要介紹了C++中的函數(shù)返回值與拷貝用法,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論