fread 和 fwrite 函數用法示例以及注意事項


1.函數功能

  用來讀寫一個數據塊。

2.一般調用形式

  fread(buffer,size,count,fp);

  fwrite(buffer,size,count,fp);

3.說明

  (1)buffer:是一個指針,對fread來說,它是讀入數據的存放地址。對fwrite來說,是要輸出數據的地址。

  (2)size:要讀寫的字節數;

  (3)count:要進行讀寫多少個size字節的數據項;

  (4)fp:文件型指針。

注意:

      1 完成次寫操(fwrite())作后必須關閉流(fclose());

       2 完成一次讀操作(fread())后,如果沒有關閉流(fclose()),則指針(FILE * fp)自動向后移動前一次讀寫的長度,不關閉流繼續下一次讀操作則接着上次的輸出繼續輸出;

       3 fprintf() : 按格式輸入到流,其原型是int fprintf(FILE *stream, const char *format[, argument, ...]);其用法和printf()相同,不過不是寫到控制台,而是寫到流罷了。注意的是返回值為此次操作寫入到文件的字節數。如int c = fprintf(fp, "%s %s %d %f", str1,str2, a, b) ;str1:10字節;str2: 10字節;a:2字節;b:8字節,c為33,因為寫入時不同的數據間自動加入一個空格。

文件使用之后一定要關閉,否則將不能正確顯示內容

fopen /open區別

UNIX環境下的C 對二進制流文件的讀寫有兩套班子:1) fopen,fread,fwrite ; 2) open, read, write
這里簡單的介紹一下他們的區別。
1. fopen 系列是標准的C庫函數;open系列是 POSIX 定義的,是UNIX系統里的system call。
也就是說,fopen系列更具有可移植性;而open系列只能用在 POSIX 的操作系統上。
2. 使用fopen 系列函數時要定義一個指代文件的對象,被稱為“文件句柄”(file handler),是一個結構體;而open系列使用的是一個被稱為“文件描述符” (file descriptor)的int型整數。
3. fopen 系列是級別較高的I/O,讀寫時使用緩沖;而open系列相對低層,更接近操作系統,讀寫時沒有緩沖。由於能更多地與操作系統打交道,open系列可以訪問更改一些fopen系列無法訪問的信息,如查看文件的讀寫權限。這些額外的功能通常因系統而異。
4. 使用fopen系列函數需要"#include <sdtio.h>";使用open系列函數需要"#include <fcntl.h>" ,鏈接時要之用libc(-lc)
小結:
總的來說,為了使程序獲得更好的可移植性,未到非得使用一些fopen系列無法實現的功能的情況下,fopen系列是首選。

read/writefread/fwrite區別

1,fread是帶緩沖的,read不帶緩沖.
2,fopen是標准c里定義的,open是POSIX中定義的.
3,fread可以讀一個結構.read在linux/unix中讀二進制與普通文件沒有區別.
4,fopen不能指定要創建文件的權限.open可以指定權限.
5,fopen返回指針,open返回文件描述符(整數).
6,linux/unix中任何設備都是文件,都可以用open,read.
如果文件的大小是8k。
你如果用read/write,且只分配了2k的緩存,則要將此文件讀出需要做4次系統調用來實際從磁盤上讀出。
如果你用fread/fwrite,則系統自動分配緩存,則讀出此文件只要一次系統調用從磁盤上讀出。
也就是用read/write要讀4次磁盤,而用fread/fwrite則只要讀1次磁盤。效率比read/write要高4倍。
如果程序對內存有限制,則用read/write比較好。
都用fread 和fwrite,它自動分配緩存,速度會很快,比自己來做要簡單。如果要處理一些特殊的描述符,用read 和write,如套接口,管道之類的
系統調用write的效率取決於你buf的大小和你要寫入的總數量,如果buf太小,你進入內核空間的次數大增,效率就低下。而fwrite會替你做緩存,減少了實際出現的系統調用,所以效率比較高。
如果只調用一次(可能嗎?),這倆差不多,嚴格來說write要快一點點(因為實際上fwrite最后還是用了write做真正的寫入文件系統工作),但是這其中的差別無所謂。

參考文章:http://www.cnblogs.com/shengge/articles/2033129.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM