2016-08-09 80 views
2

將程序保存在turbo C++中後,它保存的地方不會顯示文件的各個組件,它執行兩次。它是一個大學項目。問題似乎是代碼的一部分編寫爲開放和for循環C文件程序不會執行fopen

#include<stdio.h> 
typedef struct 
{ 
     int select; 
     char lastname[25]; 
     char firstname[25]; 
     char address[25]; 
     char phonenumber[25]; 
} addressbook; 

#define ARRAYLEN 2 

addressbook a[ARRAYLEN]; 
FILE *fp; 

int main() 
{ 
    int i; 

    fp = fopen("addressbook.dat","a+"); 

    for(i=0; i<ARRAYLEN ; i++) 
    { 
     printf("enter details\n"); 
     printf("enter lastname:\n"); 
     scanf("%s", a[i].lastname); 
     printf("enter firstname:\n"); 
     scanf("%s", a[i].firstname); 
     printf("enter address:\n"); 
     scanf("%s", a[i].address); 
     printf("enter phone number:\n"); 
     scanf("%s", a[i].phonenumber); 
     fwrite(&a[i], sizeof(a), 1, fp); /* notice, array indexed */ 
    } 
    fclose(fp); 

    fopen("addressbook.dat", "r"); 
    for(i=0; i<ARRAYLEN; i++) 
    { 
     fread(&a[i], sizeof(a), 1, fp); 
     printf("lastname:%s\n", a[i].lastname); 
     printf("firstname:%s\n", a[i].firstname); 
     printf("address:%s\n", a[i].address); 
     printf("phonenumber:%s\n", a[i].phonenumber); 
    } 
    fclose(fp); 

    return 0; 
} 
+2

第二'的fopen '不使用它的返回值。它應該是'fp = fopen(「addressbook.dat」,「r」);'另外,你應該檢查'fp'來查看它是否爲NULL並且如果是的話採取適當的行動。 –

+0

@RishikeshRaje發佈它作爲答案。這是正確的解決方案。將[UB](https://en.wikipedia.org/wiki/Undefined_behavior)添加到'fread'並使用關閉的'fp'。 – LPs

+0

題外評論...您使用scanf()讀取用戶輸入是非常非常糟糕的做法。考慮:1)如果用戶輸入超出您的字段大小的名稱/地址,會發生什麼情況? 2)如果用戶輸入多個令牌(已知存在多個名字,並且地址或電話號碼通常被格式化爲包含空格)會發生什麼? - 一個很好的選擇是讀取整行輸入(使用'fgets()'並調整緩衝區大小,如果你沒有得到整行),然後檢查你有多少輸入,動態分配內存和從輸入緩衝區。 – DevSolar

回答

5

問題是與使用'fp' - 文件指針。

第一次使用fopen後,您正在關閉它,然後再次使用fopen。

但是這一次,你沒有把它的值返回到fp。所以你的下面的動作(比如fread)會產生不確定的結果。

請更換 -

fopen("addressbook.dat", "r"); 

fp = fopen("addressbook.dat", "r"); 

代碼中的其他問題 -

  1. 總是檢查返回值

  2. 你的東東d驗證從用戶接收的值,不超過給變量

  3. 不言而喻允許的空間,但使用的是FCLOSE(FP)兩次在您corrent解決方案

+0

你現在如何格式化代碼的答案? (只需用'4-spaces'縮進代碼':)' –

+0

謝謝@David C. Rankin –

+0

這太好了,歡迎來到SO。 –