linux下c語言中fread和fwrite的區別

學習了write函數和read函數時總把裏面的參數弄混,今天特地寫這篇博客將這兩個函數的各個參數弄明白。同時還要明白read和fread的區別,write和fwrite的區別。

write函數
函數原型:ssize_t write(int fd,const void* buf,size_t count);

函數說明:write()會把參數buf所指向的內存寫入count個字節放到參數所指向的文件裏。如果成功寫入會返回實際寫入的字節數,當有錯誤發生時則返回-1,錯誤代碼存放在error中。

參數解釋:

fd:是文件描述符,write所對應的是寫,即就是1號文件描述符(對應標準輸出)
buf:通常是一個字符串,需要寫入的字符串
count:每次寫入的字節數
說明:write函數返回值一般無0,只有當如下情況發生時纔會返回0:write(fd,p1+len,(strlen(p1)-len))中第三個參數爲0,此時write函數說明也不做,只返回0.write函數從buf寫數據到fd中,若buf中數據無法一次性讀完,那麼第二次讀buf中的數據時,其讀指針位置,即第二個參數buf不會自動移動,需要程序員編程控制。但並不是簡單的將buf首地址填入第二個參數,可以按如下格式實現讀位置移動:write(fd,p1+len,(strlen(p1)-len)),這樣write第二次循環時就會從p1+len處寫數據到fd,後面以此類推,直至strlen(p1)-len的值變爲0.

read函數
函數說明:read函數會把參數fd所指的文件傳送count個字節到buf指針所指的內存中。返回值爲實際讀取到的字節數,如果返回0表示已經到達文件末尾或是無可讀取的數據。若參數count爲,則read函數不會有作用並返回0.

函數原型:ssize_t read(int fd ,void *buf, size_t count);

參數解釋:

fd:是文件描述符
buf:爲讀出數據的緩衝區
count:爲每次讀取的字節數(是請求讀取的字節數,讀上來的數據保 存在緩衝區buf中,同時文件的當前讀寫位置向後移)
注意:read函數參數中fd所指向的文件中的數據如果小於要讀取的數據就會引起阻塞。

寫一個例子說明write函數和read函數的用法:

   #include<stdio.h>
   #include<sys/stat.h>
   #include<sys/types.h>
   #include<fcntl.h>
   #include<string.h>
   #include<unistd.h>
   
   int main()
   {
     umask(0);
    int fd = open("myfile",O_WRONLY|O_CREAT,0644);
    if(fd < 0)
     {
         perror("open");
         return 1;
     }
     const char *msg = "hello world";
     write(fd,msg,strlen(msg));//將msg指針指向的內容寫進fd文件描述符所對應的文件中,即寫進myfile中
     char buf[1024];
     ssize_t s = read(fd,buf,strlen(msg)); //將fd所指向的文件中的內容讀進buf所指向的內存中                                         
     if(s > 0)
     {
         printf("%s",buf);
    }
    return 0;
}
 
 
 
fread和fwrite函數
size_t fread(void *buf, size_t size, size_t count, FILE *fp);

size_t fwrite(const void * buf, size_t size, size_t count, FILE *fp);

ptr爲指向緩衝區保存或讀取的數據。
size爲控制記錄大小。
nmemb爲記錄數。
函數返回讀取或回寫的記錄數。
即 fread 函數從文件 fp 中讀出“size*count”個字節保存到 buf 中,而 fwrite 把 buf 中的“size*count”個字節寫到文件 fp 中。最後,函數 fread 和 fwrite 的返回值爲讀或寫的記錄數,成功時返回的記錄數等於 count 參數,出錯或讀到文件末尾時返回的記錄數小於 count,也可能返回 0。需要注意的是,儘管 fread 和 fwrite 函數可以對數據進行成塊讀寫,但並不是說一次想讀寫多少數據就能全部讀寫多少數據,畢竟緩存有限,而且不同的操作系統的緩存大小也可能不一樣。

用法差異
效率:fread爲封裝好的庫函數,而read爲系統函數,一般來說,fread效率更高。
讀取文件差別:fread功能更強大,可以的結構體的二進制文件。如果底層的操作,用到文件描述符,用read更好。

原文鏈接:https://blog.csdn.net/tangya3158613488/article/details/102853398

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章