2011-06-15 47 views
1

我需要編寫一個簡單的測量轉換程序。 程序首先詢問用戶二進制文件的名稱(單位轉換數據),打開文件並設置數組。讀取二進制文件並將所有數據存儲到結構數組中

我的結構:

struct unit {    
    char name[NAME_LEN];   
    char abbrev[ABBREV_LEN];  
    char class[CLASS_LEN];          
    double standard;    
}; 

和我的功能:

int fread_units(int unit_max,struct unit units[], int *unit_sizep) 
{ 
    FILE *filep; 
    struct unit data; 
    int i, status; 
    char fullname[10]; 

    /* Gets database of units from file         */ 

    printf("Enter name of binary file> "); 
    scanf("%s", fullname); 
    strcat(fullname, ".bin"); 
    i = 0; 
    filep = fopen(fullname, "rb"); 
    //fseek (filep , 0 , SEEK_END); 
    for (status = fread(&data, sizeof(struct unit), 1, filep); 
     status == 1 && i < unit_max; 
     status = fread(&data, sizeof(struct unit), 1, filep)){ 
     units[i++] = data; 
    } 
    printf("\n%f", units[3].standard); 
    /* Issue error message on premature exit       */ 
    if (status == 0) { 
     printf("\n*** Error in data format ***\n"); 
     printf("*** Using first %d datavalues ***\n",i); 
    } 
    else if (status != EOF) { 
     printf("\n*** Error: too much data in file ***\n"); 
     printf("*** Using first %d data values ***\n", i); 
    } 

    /* Send back size of used portion of array       */ 
    *unit_sizep = i; 

    if(status == 4) 
     status = 1; 
    else if (status != EOF) 
     status = 0; 
    fclose(filep); 

    return(status); 
} 

根據這本書,(fread(&data, sizeof(struct unit), 1, filep);)足以將所有數據存儲到一個結構。

但它不爲我工作...

輸出:

*** Error in data format *** 
*** Using first 4 datavalues *** 
To convert 25 kilometers to miles, you would enter 
> 25 kilometers miles 
    or, alternatively, 
> 25 km mi 
> 25 km mi 
Attempting conversion of 25.0000 km to mi . . . 
Unit kmnot in database 

Enter a conversion problem or q to quit. 
> 

我units.bin文件;

miles     mi   distance  1609.3 
kilometers    km   distance  1000 
yards     yd   distance  0.9144 
meters     m   distance  1 
quarts     qt   liguid_volume 0.94635 
liters     l   liquid_volume 1 
gallons     gal   liquid_volume .7854 
millimeters    ml   liquid_volume 0.001 
kilograms    kg   mass   1 
grams     g   mass   0.001 
slugs     slugs  mass   0.14594 
+2

等待,您的units.bin文件是**文本**文件嗎? 「標準」字段如何真正保存? – littleadv 2011-06-15 17:47:35

+0

你的結構說最後一個字段是'double',但是你的文件包含number_的文本表示!你必須做別的事情來閱讀文本數字,然後將其轉換爲實際的雙數。 – 2011-06-15 17:58:37

+0

如何創建二進制文件來處理它? – mustafaSarialp 2011-06-15 18:22:31

回答

0

我解決了我的問題。我用下面的代碼創建了一個二進制文件。

#include <stdio.h> 

#define NAME_LEN 30 
#define ABBREV_LEN 15 
#define CLASS_LEN 20 
#define MAX_UNITS 20 

struct unit {    
    char name[NAME_LEN];   
    char abbrev[ABBREV_LEN];  
    char class[CLASS_LEN];          
    double standard;    
}; 

int main(void) 
{ 
    int i; 
    struct unit unitp[MAX_UNITS]; 
    FILE *inp, *outp; 
    inp = fopen("units.dat", "r"); 
    outp = fopen("units.bin", "wb"); 
    for(i=0;!feof(inp);i++){ 
     fscanf(inp, "%s%s%s%lf", unitp[i].name, 
            unitp[i].abbrev, 
            unitp[i].class, 
            &unitp[i].standard); 
    } 
    fwrite(unitp, sizeof(struct unit), i, outp); 

    fclose(inp); 
    fclose(outp); 

    return(0); 
} 

and my for loop;

for (status = fread(&units[i++], sizeof(struct unit), 1, filep); 
    i < MAX_UNITS && !feof(filep); 
    status = fread(&units[i++], sizeof(struct unit), 1, filep)){ 
    //units[i++] = data; 
} 
相關問題