菜鳥隨筆(4)---read函數與fread函數的區別

一隻菜鳥橫空出世,碼農世界闖一闖,天天進展多一丟丟數組

 

read函數與fread函數的區別函數

轉自:https://blog.csdn.net/qq_33832591/article/details/52268477
ui

(1)格式

read: 
ssize_t read(int fd ,void *buf, size_t count); 
read用於從文件描述符對應的文件讀取數據,調用成功返回讀出的字節數;buf爲讀出數據的緩衝區,count爲每次讀取的字節數,出錯返回-1,EOF返回0。 
例如:一個文件大小600字節,每次讀取400字節,則第一次讀取返回400,第二次讀取返回300,而且要注意若是buf爲一個數組,每次讀取的count最大爲sizeof(buf)-1,由於字符串結尾標誌爲‘\0’,佔用一個字節,不然會出現亂碼。 
fread: 
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream); 
ptr爲指向緩衝區保存或讀取的數據。 
size爲控制記錄大小。 
nmemb爲記錄數。 
函數返回讀取或回寫的記錄數。 
例如: 
char buf[100]; 
size_t temp=fread(buf,10,1,p); 
這個語句表示,每次讀取10個字節到buf裏邊(10×1),若是讀取的字節數少於10個返回0,所以,若是想知道讀取文件的具體字節數,須要將上邊的語句改成: 
size_t temp=fread(buf,10,1,p);spa

(2)代碼比較

經過read和fread計算返回的字節數和顯示讀取的文件內容。.net

#include<stdio.h> #include<string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<errno.h> #include <unistd.h> int main(int arg,char *args[]){ int num; if(arg<2) return 0; int fd=open(args[1],O_RDONLY); if(fd==-1){ printf("%s\n",strerror(errno)); } else{ printf("fd=%d\n",fd); char buf[100]; memset(buf,0,sizeof(buf)); while (1) { int temp=read(fd,buf,sizeof(buf)-1);//注意這裏 num=num+temp; printf("%s",buf); memset(buf,0,sizeof(buf));//每次讀取後清零buf if(temp<=0)//當文件讀取結束時,退出循環 break; } printf("num=%d\n",num); } close(fd); } 

咱們首先經過 ls -l查看要讀取的read.c文件的大小爲688字節。code

xin@xin-Lenovo-V3000:~/code/test$ ls -l 總用量 28 -rw-rw-r-- 1 xin xin 175 8月 21 17:00 makefile -rwxrwxr-x 1 xin xin 10504 8月 21 17:49 read -rw-rw-r-- 1 xin xin 688 8月 21 17:49 read.c -rw-rw-r-- 1 xin xin 4728 8月 21 17:49 read.o 

 

而後運行make程序:blog

xin@xin-Lenovo-V3000:~/code/test$ ./read read.c fd=3 #include<stdio.h> #include<string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<errno.h> #include <unistd.h> int main(int arg,char *args[]){ int num; if(arg<2) return 0; int fd=open(args[1],O_RDONLY); if(fd==-1){ printf("%s\n",strerror(errno)); } else{ printf("fd=%d\n",fd); char buf[100]; memset(buf,0,sizeof(buf)); while (1) { int temp=read(fd,buf,sizeof(buf)-1); num=num+temp; printf("%s",buf); memset(buf,0,sizeof(buf)); if(temp<=0) break; } printf("num=%d\n",num); } close(fd); } num=688 

 

咱們發現fd=3,由於每一個進程啓動時都打開三個文件,標準輸入文件(stdin),標準輸出文件(stdout),標準出錯文件(stderr),這三個文件分別對應文件描述符0,1,2。所以再打開文件的話,按順序fd=3。 
注意:若是關閉標準輸出: 
close(STDOUT_FILENO);則1空閒,再次打開的文件描述符爲1。 
num=688與實際字節數相同。進程

fread用法:字符串

#include<stdio.h> #include<string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include<errno.h> #include <unistd.h> int main(int arg,char *args[]){ FILE *p=fopen(args[1],"r+"); if(p==NULL){ printf("error is %s\n",strerror(errno)); } else{ char buf[100]; memset(buf,0,sizeof(buf)); size_t rc=0; while(1){ size_t temp=fread(buf,1,10,p); rc=rc+temp; printf("%s",buf); memset(buf,0,sizeof(buf)); if(temp==0) break; } printf("rc=%d\n",rc); fclose(p); } }

返回688字節。結果和read的相同。string

(3)用法差別

效率:fread爲封裝好的庫函數,而read爲系統函數,通常來講,fread效率更高。 
讀取文件差異:fread功能更強大,能夠的結構體的二進制文件若是底層的操做

相關文章
相關標籤/搜索