2015-11-07 25 views
1

比方說,我有一個5000字節大小的文件,我試圖讀取它。在fread調用中元素的大小和數量是否可以交換?

我有這樣的代碼:

int main() 
{ 
    char *file_path[] = "/path/to/my/file" 
    FILE *fp= fopen(file_path,"rb"); //open the file 
    fseek(fp, 0, SEEK_END); // seek to end of file 
    unsigned long fullsize = ftell(fp); //get the file size (5000 for this example) 
    fseek(fp, 0, SEEK_SET); //bring back the stream to the begging 
    char *buf = (char*)malloc(5000); 
    fread(buf,5000,1,fp); 
    free(buf); 
    return 0; 
} 

我也可以代替fread呼叫與

fread(buf,1000,5,fp); 

什麼是好?爲什麼? 在優化問題上,我瞭解到返回值是不同的。

+1

這兩段代碼做了不同的事情。你想達到什麼目的? – Nayuki

+1

你的意思是'fread(buf,1000,5,fp)'和'fread(buf,5000,1,fp)'之間的區別嗎? – Downvoter

+0

@cad是的。我試圖在buf中處理數據,並操縱他..一些memcpy,一些寫入另一個文件.. – raptor0102

回答

1

我總是發現它最好使用1的元素大小。如果fread() 無法讀取文件末尾的完整元素,它將跳過 最後的部分元素。當最後一個元素爲 時,這是不可取的。另一方面,使用1作爲元素大小沒有任何危害。

,打印本身並演示了這種行爲

示例代碼:

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

#define SIZE 100 
#define N 1 

int main() 
{ 
    FILE *fin; 
    int ct; 
    char buf[SIZE * N + 1]; 

    fin = fopen("size_n.c", "r"); 

    while (1) { 
     ct = fread(buf, SIZE, N, fin); 
     if (!ct) 
      break; 
     buf[ct * SIZE] = '\0'; 
     fputs(buf, stdout); 
    } 
} 
+0

在這個例子中 - 因爲你正在閱讀'char's - 實際上*的元素大小是* 1。但是如果你正在閱讀,比方說'double'的數組,不讀「最後的部分元素」可能是合適的。 – 5gon12eder

+0

@ 5gon12eder:恩,是的,我想你是對的。但是,由於可移植性,我一直非常努力地拒絕閱讀這樣的機器專用格式。 –

+0

是的,這通常是一個好主意,但我認爲'fread'函數接受size參數的原因是讀取'char's以外的類型。這樣做並不總是壞事。例如,如果在同一臺機器上運行兩個進程,通過管道進行通信,則使用二進制格式非常合適。 – 5gon12eder

1

如果你交換這兩個參數,你仍然要求讀取相同的字節數。然而行爲在其他方面是不同的:

  • 既然你應該總是被檢查fread返回值如果文件大於量
  • 返回值

短,會發生什麼,這很重要:)

如果使用的形式爲result = fread(buf, 1, 5000, fp);,即讀取5000單元的大小爲1,但是fi文件大小隻有3000,那麼會發生什麼是那些3000字節被放置在您的緩衝區中,並返回3000

換句話說,你可以檢測部分讀取並仍然使用部分結果。如果使用result = fread(buf, 5000, 1, fp);

然而,即讀1單元尺寸5000的,則緩衝器的內容是不定(即相同的未初始化的變量的狀態),並且返回值是0

在這兩種情況下,部分讀取離開處於不確定狀態的文件指針,即你需要fseek做任何進一步讀取之前。

使用後一種形式(即除1以外的任何大小)可能最適合當您要中止全尺寸不可用或者正在讀取具有固定大小記錄的文件時。

相關問題