天天看點

fread(),fwrite() 讀/寫流

C 庫函數 - fread()

描述

C 庫函數 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 從給定流 stream 讀取資料到 ptr 所指向的數組中。

聲明

下面是 fread() 函數的聲明。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)      

參數

  • ptr -- 這是指向帶有最小尺寸 size*nmemb 位元組的記憶體塊的指針。
  • size -- 這是要讀取的每個元素的大小,以位元組為機關。
  • nmemb -- 這是元素的個數,每個元素的大小為 size 位元組。
  • stream -- 這是指向 FILE 對象的指針,該 FILE 對象指定了一個輸入流。

傳回值

成功讀取的元素總數會以 size_t 對象傳回,size_t 對象是一個整型資料類型。如果總數與 nmemb 參數不同,則可能發生了一個錯誤或者到達了檔案末尾。

執行個體

下面的執行個體示範了 fread() 函數的用法。

#include <stdio.h>
#include <string.h>

int main()
{
   FILE *fp;
   char c[] = "This is new world";
   char buffer[20];

   /* 打開檔案用于讀寫 */
   fp = fopen("file.txt", "w+");

   /* 寫入資料到檔案 */
   fwrite(c, strlen(c) + 1, 1, fp);

   /* 查找檔案的開頭 */
   fseek(fp, SEEK_SET, 0);

   /* 讀取并顯示資料 */
   fread(buffer, strlen(c)+1, 1, fp);
   printf("%s\n", buffer);
   fclose(fp);
   
   return(0);
}      

讓我們編譯并運作上面的程式,這将建立一個檔案 file.txt,然後寫入内容 this is w3cschool。接下來我們使用 fseek() 函數來重置寫指針到檔案的開頭,檔案内容如下所示:

This is new world
      

C 庫函數 - fwrite()

C 庫函數 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的數組中的資料寫入到給定流 stream 中。

下面是 fwrite() 函數的聲明。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)      

  • ptr -- 這是指向要被寫入的元素數組的指針。
  • size -- 這是要被寫入的每個元素的大小,以位元組為機關。
  • stream -- 這是指向 FILE 對象的指針,該 FILE 對象指定了一個輸出流。

如果成功,該函數傳回一個 size_t 對象,表示元素的總數,該對象時一個整型資料類型。如果該數字與 nmemb 參數不同,則會顯示一個錯誤。

下面的執行個體示範了 fwrite() 函數的用法。

#include<stdio.h>

int main ()
{
   FILE *fp;
   char str[] = "This is new world.cc";

   fp = fopen( "file.txt" , "w" );
   fwrite(str , 1 , sizeof(str) , fp );

   fclose(fp);
  
   return(0);
}      

讓我們編譯并運作上面的程式,這将建立一個檔案 file.txt,它的内容如下:

This is new world.cc      

現在讓我們使用下面的程式檢視上面檔案的内容:

#include <stdio.h>

int main ()
{
   FILE *fp;
   int c;

   fp = fopen("file.txt","r");
   while(1)
   {
      c = fgetc(fp);
      if( feof(fp) )
      {
          break ;
      }
      printf("%c", c);
   }
   fclose(fp);
   return(0);
}