2016-08-09 51 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。 –