fread函數返回值

fread函數原型:linux

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

size和count的含義:每次讀count個塊,每塊爲size字節函數

fread的返回值含義爲:讀到的塊數,假定如今返回值爲num(size太具備歧義,會讓人覺得是讀到的字節數)rem

num值的判斷:原型

1.num == count,讀操做成功,返回count*size個字節;效率

2.num == 0,此時fread並不必定是讀錯了或到文件末尾了,fread函數返回值並無判斷這兩種狀況,以上兩種狀況只能用函數ferror和feof判斷(返回值非零爲正常)。stream

   當num爲0時,也有可能只是讀到的塊數爲0,前面說了不必定是文件末尾,那爲何會返回0呢?file

    num = fread ( buf, 1024, 1, fp),看一下這個例子,假如你的文件大小不足1024字節,或是循環讀文件,最後一次循環剩餘的字節小於1024字節,這個時候fread就會返回0值,而且buf中沒有數據,這就致使文件根本沒有讀過去或是沒讀夠。循環

解決這個問題的方法:方法

1.最簡單,也就粗暴的方法,就是將size置爲1, fread ( buf, 1, 1024, fp),一次讀1字節,怎麼樣都不會錯,這個方法的缺點就在於效率低下,並非fread函數使用的初衷,以塊讀寫是爲了提升效率的,因此這種方法只能用於沒有辦法的時候。

2.在讀文件以前,先使用stat函數,獲取文件的大小,這樣讀取到末尾的時候直接寫具體的大小就行了,大體以下:

  filesize = stat(file,...);

  n = filesize/size;

  remain = filesize%size;

  while(n){ fread(..,size,........);    n--;    }

  fread(..,remain,............);

此方法的缺點就是stat函數是linux系統函數,windows系統下沒法使用,暫時也沒找到替代函數.......(linux系統還能夠直接用read函數.....windows簡直.............第一種方法就是在沒找到更好的方法以前,在windows下用的,沒有辦法的辦法)

 

PS:若是大神們能看見個人拙見,有更好的在windows下的解決方法,必定要告訴我[含淚期待臉]

相關文章
相關標籤/搜索