2014-11-03 66 views
0

目標是一次從文件中讀取一個RECORD。每個記錄是16個字節。下面的代碼一次從文件中讀取一個ELEMENT。我如何改變fread()來一次讀取全部16個字節?數據讀取性能優化

目標:一次從磁盤讀取一條記錄中的數據(在單個fread()調用中從磁盤讀取16個字節),然後將其分成單獨的元素。

//Original unoptimized code to read one ELEMENT at a time 
// Read the file in a naive way: 
// One data item at a time! 
struct record read_record_naive(FILE *fp, int endian) 
{ 
    struct record my_data = {0,0,0,0,0}; 
    int result; 
    uint8_t empty=0; 

    my_data.valid = 1; 
    result = fread(&(my_data.my8), sizeof(my_data.my8), 1, fp); 
    if(!result) 
    { 
     my_data.valid = 0; 
     return my_data; 
    } 

    result = fread(&(empty), sizeof(empty), 1, fp); 
    if(!result) 
    { 
     my_data.valid = 0; 
     return my_data; 
    } 

    result = fread(&(my_data.my16), sizeof(my_data.my16), 1, fp); 
    if(!result) 
    { 
     my_data.valid = 0; 
     return my_data; 
    } 

    result = fread(&(my_data.my32), sizeof(my_data.my32), 1, fp); 
    if(!result) 
    { 
     my_data.valid = 0; 
     return my_data; 
    } 

    result = fread(&(my_data.my64), sizeof(my_data.my64), 1, fp); 
    if(!result) 
    { 
     my_data.valid = 0; 
     return my_data; 
    } 

    if(endian == ENDIAN_LITTLE) 
    record_swap_endian(&my_data); 

    return my_data; 
} 
+0

如果你正在將整個數據結構寫入文件,那麼你應該簡單地按照@Serge Ballesta的答案來做,但是如果你有不同不同實體的數據,那麼你需要像你一樣一個一個地把它取出來。 – ravibhuva9955 2014-11-03 08:17:06

回答

1

什麼簡單:

result = fread(&my_data), sizeof(my_data), 1, fp); 

難道還不夠嗎?