天天看點

fopen()、fwrite()、fread()函數使用說明與示例

fopen()函數:

2.函數原型:

fopen()、fwrite()、fread()函數使用說明與示例

FILE * fopen(const char * path,const char * mode);  

    -- path: 檔案路徑,如:"F:\Visual Stdio 2012\test.txt"  

    -- mode: 檔案打開方式,例如:  

             "r" 以隻讀方式打開檔案,該檔案必須存在。  

             "w" 打開隻寫檔案,若檔案存在則檔案長度清為0,即該檔案内容會消失。若檔案不存在則建立該檔案。  

            "w+" 打開可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案内容會消失。若檔案不存在則建立該檔案。  

             "a" 以附加的方式打開隻寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留。(EOF符保留)  

             "a+" 以附加方式打開可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的内容會被保留。(原來的EOF符不保留)  

            "wb" 隻寫打開或建立一個二進制檔案,隻允許寫資料。  

            "wb+" 讀寫打開或建立一個二進制檔案,允許讀和寫。  

             "ab" 追加打開一個二進制檔案,并在檔案末尾寫資料。  

             "ab+"讀寫打開一個二進制檔案,允許讀,或在檔案末追加資料。     

    --傳回值: 檔案順利打開後,指向該流的檔案指針就會被傳回。如果檔案打開失敗則傳回NULL,并把錯誤代碼存在errno中。          

fwrite()函數:

1.作用:在C語言中fwrite()函數常用語将一塊記憶體區域中的資料寫入到本地文本。

fopen()、fwrite()、fread()函數使用說明與示例

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

    -- buffer:指向資料塊的指針  

    -- size:每個資料的大小,機關為Byte(例如:sizeof(int)就是4)  

    -- count:資料個數  

    -- stream:檔案指針  

注意:傳回值随着調用格式的不同而不同:

    (1) 調用格式:fwrite(buf,sizeof(buf),1,fp);

    成功寫入傳回值為1(即count)

    (2)調用格式:fwrite(buf,1,sizeof(buf),fp);

    成功寫入則傳回實際寫入的資料個數(機關為Byte)

fopen()、fwrite()、fread()函數使用說明與示例

3. 注意事項:

    寫完資料後要調用fclose()關閉流,不關閉流的情況下,每次讀或寫資料後,檔案指針都會指向下一個待寫或者讀資料位置的指針。

示例說明:

代碼1:下面代碼可将1024個字(int)寫入到文本檔案,fwrite的調用中,size是sizeof(int),count是DATA_SIZE

fopen()、fwrite()、fread()函數使用說明與示例

#include "stdafx.h"  

#define _CRT_SECURE_NO_WARNINGS  

#include <stdio.h>  

#include <stdlib.h>  

#define DATA_SIZE 1024  

int main()  

{  

    unsigned int *dataPtr = NULL;  

    dataPtr = (unsigned int *)malloc(sizeof(int)*DATA_SIZE);  

    for(unsigned int i=0;i<DATA_SIZE;i++)  

    {  

        dataPtr[i] = i; //初始化緩存區  

    }  

    FILE *fp = fopen("F:\\Labwindows cvi\\test.txt","w");  

    fwrite(dataPtr,sizeof(int),DATA_SIZE,fp);  

       fclose(fp);  

       free(dataPtr);  

    system("pause");  

    return 0;  

}  

代碼2:下面代碼也可将1024個字寫到文本中,雖然fwrite函數中,size是1,但count是DATA_SIZE*sizeof(int)。與代碼1實作的結果一樣。

fopen()、fwrite()、fread()函數使用說明與示例

// datasave.cpp : 定義控制台應用程式的入口點。  

//  

    FILE *fp = fopen("F:\\Labwindows cvi\\test.txt","ab+");  

    fwrite(dataPtr,1,DATA_SIZE*sizeof(unsigned int),fp);  

<pre name="code" class="cpp">       fclose(fp);  

<pre name="code" class="cpp">       free(dataPtr);  

    system("pause");    return 0;}

代碼3:下面的代碼将4096個char資料寫到文本,寫入的資料中,最大值為255,與上面代碼1、2有差別,因為緩存區資料類型不同

fopen()、fwrite()、fread()函數使用說明與示例

    unsigned char *dataPtr = NULL;  

    dataPtr = (unsigned char *)malloc(sizeof(int)*DATA_SIZE); //申請的區域是4096個char,即1024個字的區域  

    fwrite(dataPtr,sizeof(char),DATA_SIZE*sizeof(int),fp);  

    fclose(fp);        

代碼4:用malloc函數申請區域時是申請的一片char*區域,通過強制類型轉換後可裝unsigned int 資料。

fopen()、fwrite()、fread()函數使用說明與示例

    unsigned int *Ptr = NULL;  

    dataPtr = (unsigned char *)malloc(sizeof(int)*DATA_SIZE);  

    Ptr = (unsigned int *) dataPtr;  

        Ptr[i] = i;   

    fwrite(Ptr,sizeof(unsigned int),DATA_SIZE,fp);  

    fclose(fp);  

    free(dataPtr);  

   system("pause");  

fread()函數:

1. 作用:從一個檔案流中讀取資料

2. 函數原型如下:

fopen()、fwrite()、fread()函數使用說明與示例

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

  -- buffer:指向資料塊的指針  

  -- size:每個資料的大小,機關為Byte(例如:sizeof(int)就是4)  

  -- count:資料個數  

  -- stream:檔案指針  

(1) 調用格式:fread(buf,sizeof(buf),1,fp);

讀取成功時:當讀取的資料量正好是sizeof(buf)個Byte時,傳回值為1(即count)

                       否則傳回值為0(讀取資料量小于sizeof(buf))

(2)調用格式:fread(buf,1,sizeof(buf),fp);

讀取成功傳回值為實際讀回的資料個數(機關為Byte)

代碼參考:

fopen()、fwrite()、fread()函數使用說明與示例

#include <string.h>  

int main(int argc, char *argv[])  

    FILE *filp = NULL;  

    char fileDir[] = "/home/yangzhiyuan/Documents/test.txt";   

    char dataPtr[] = "Helloworld";  

    printf("sizeof(dataPtr) = %ld\n",sizeof(dataPtr));  

    filp = fopen(fileDir,"w+");  /* 可讀可寫,不存在則建立 */  

    int writeCnt = fwrite(dataPtr,sizeof(dataPtr),1,filp);  /* 傳回值為1 */  

    //int writeCnt = fwrite(dataPtr,1,sizeof(dataPtr),filp);  /* 傳回值為11 */  

    printf("writeCnt = %d\n",writeCnt);  

    fclose(filp);  

    FILE *fp = NULL;  

    fp = fopen(fileDir,"r");  

    char buffer[256];  

    int readCnt = fread(buffer,sizeof(buffer),1,fp);  /* 傳回值為0 */  

    //int readCnt = fread(buffer,1,sizeof(buffer),fp);  /* 傳回值為11 */      

    printf("readCnt = %d\n",readCnt);  

    printf("%s\n",buffer);  

    exit(0);  

注意:本例代碼中定義了兩個FILE變量,一個用于write,一個用于read,寫完後要close掉,然後再打開,然後讀。如果直接使用一個FILE變量,會出錯!

繼續閱讀