2011-12-02 59 views
0

我沒有問題打開和閱讀二進制文件,當我沒有把它傳遞給一個函數。但是,在這種情況下,我將它傳遞給一個函數,並繼續遇到問題。在函數中打開二進制文件?看代碼:

void fun1 (int amount,struct inventory a[],FILE *fp); 

int main() 
{ 
    tag a[10]; 
    int amount; 
    int i; 
    FILE *fp; 

    fp=fopen("e:\\invent.txt","wb"); 

    printf("How many items do you want to enter? "); 
    scanf("%d",&amount); 
    for(i=1;i<=amount;i++) 
    { 
     printf("Enter the name of the item: "); 
     scanf("%s",a[i].name); 
     printf("Enter the unit amount the item has: "); 
     scanf("%d",&a[i].num); 
     printf("Enter the unit price for the item: "); 
     scanf("%f",&a[i].price); 
     fwrite(&a[i],sizeof(a[i]),amount,fp); 
    } 
    fclose(fp); 
    fun1(amount,a,fp);   
} 

^^這是我的輸入加我的函數調用^^。

我輸入:

多少個項目你想進入? 2
輸入項目的名稱:錘
輸入單元量的項具有:32
輸入的單位價格的項目:11
輸入項目的名稱:釘子
輸入單位量的項目有:43
輸入單價爲項目:12

void fun1 (int amount,struct inventory a[],FILE *fp) 
{ 
    int i; 
    fp=fopen("e:\\invent.txt","rb"); 
    while(fread(&a[amount],sizeof(tag),amount,fp) == amount) 
    { 
     printf("\nItem\tUnit #\tPrice\n"); 
     for(i=1;i<=amount;i++) 
     { 
      printf("\n%s\t%d\t%.2f",a[i].name,a[i].num,a[i].price); 
     } 
    } 
    fclose(fp); 
    getchar(); 

} 

^^我的功能^^

我的輸出:

項目單位#價格

錘32 11.00

錘32 11.00

項目單位#價格

錘32 11.00

指甲43 12.00

它不應該打印「錘子」兩次。只有大膽的一個應該打印。如果你可以給我一個鏈接,或者如果你有建議,它將非常感激!

+0

只是出於好奇,爲什麼你通過fp函數?它在'main'中關閉,並在'fun1'中重新打開,所以它也可以是'fun1'中的局​​部變量。 –

+0

另一個需要注意的地方是,在'main'中定義'a'爲'tag a [10]',但fun1想要一個'struct inventory'數組。我猜你有'typedef結構庫存標籤'的地方。如果今天只是有點困惑,想想幾個月後會如何。爲了你自己的緣故,你應該和變量和參數的類型保持一致。 –

+0

我傳遞fp給函數,因爲我正在做的項目需要我有一個二進制文件,我必須在函數中顯示輸出。我是全新的FILE I/O的東西,所以我確定我是否做得對。 – Shamrocck

回答

1

在您的輸入中,您將爲該數組編制索引。數組是零索引的,所以你訪問的最後一個索引超出範圍,並且不知道你會得到什麼。

更改這個循環是

for (i = 0; i < amount; i++) 
0

問題是在你的FUN1方法我的事情你試圖收集整個名單,但你給結構的大小,以便它可以讀取多達第一結構

試試這個:

void fun1 (FILE *fp) 
{ 

    _tag a; 
    fp=fopen("e:\\invent.txt","rb"); 
    while(fread(&a,sizeof(_tag),1,fp) == 1) 
    { 
     printf("\nItem\tUnit #\tPrice\n"); 


     printf("\n%s\t%d\t%d",a.name,a.num,a.price); 


    } 
    fclose(fp); 

} 
相關問題