C文件程序不执行fopen

yas*_*oin 2 c fopen file

在turbo c ++中保存程序后,保存的地方不会显示文件的各个组件,并且执行两次.它适用于大学项目.问题似乎是为打开和for循环编写的代码部分

#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;
}
Run Code Online (Sandbox Code Playgroud)

dea*_*zvi 5

问题在于使用'fp' - 文件指针.

在第一次使用fopen之后,你正在关闭它,然后再次使用fopen.

但这一次,你不是把它的值返回到fp.因此,您的后续操作(如fread)会产生未经确定的结果.

请更换 -

fopen("addressbook.dat", "r");
Run Code Online (Sandbox Code Playgroud)

fp = fopen("addressbook.dat", "r");
Run Code Online (Sandbox Code Playgroud)

代码中的其他问题 -

  1. 始终检查返回值

  2. 您需要验证从用户收到的值,不要超过给予变量的允许空间

  3. 毋庸置疑,但你在你的相关解决方案中使用fclose(fp)两次