将程序保存在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