將程序保存在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;
}
第二'的fopen '不使用它的返回值。它應該是'fp = fopen(「addressbook.dat」,「r」);'另外,你應該檢查'fp'來查看它是否爲NULL並且如果是的話採取適當的行動。 –
@RishikeshRaje發佈它作爲答案。這是正確的解決方案。將[UB](https://en.wikipedia.org/wiki/Undefined_behavior)添加到'fread'並使用關閉的'fp'。 – LPs
題外評論...您使用scanf()讀取用戶輸入是非常非常糟糕的做法。考慮:1)如果用戶輸入超出您的字段大小的名稱/地址,會發生什麼情況? 2)如果用戶輸入多個令牌(已知存在多個名字,並且地址或電話號碼通常被格式化爲包含空格)會發生什麼? - 一個很好的選擇是讀取整行輸入(使用'fgets()'並調整緩衝區大小,如果你沒有得到整行),然後檢查你有多少輸入,動態分配內存和從輸入緩衝區。 – DevSolar