这代码,怎一个焦字了的? 2022-07-03 13:20 采纳率: 100%
浏览 28
已结题

输出出现问题,在对文件进行修改后,再次打开文件进行输出时出现错误,如何解决?(语言-c语言)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN 100
struct contact_type
{

char name[10];
char hometown[10];
long number[2];
char mail[10];

}cont[LEN];
void show();
void chon(int n,FILE *fp,struct contact_type *p)//重新写入
{
FILE *fp1;
int i=0;
fp=fopen("con.dat", "r+");
fp1=fopen("linshi.dat", "w+");//读写新建一个临时文件
for(i=0;i<n;i++)
{
fprintf(fp1,"%s%s%ld%ld%s\n",(p+i)->name,(p+i)->hometown,(p+i)->number[0],(p+i)->number[1],(p+i)->mail);
}
fclose(fp);
fclose(fp1);
remove("con.dat");
rename("linshi.dat", "con.dat");
}
void revise(int n,struct contact_type *p,FILE *fp)//文件修改
{
int i=0,j=0;
char c[10];
printf("请输入想要修改的对象:\n");
scanf("%s",&c);
for(i=0;i<n;i++)
{
if(strcmp(c,(p+i)->name)==0)
{
j=i;
printf("修改前信息:姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",(p+i)->name,(p+i)->hometown,(p+i)->number[0],(p+i)->number[1],(p+i)->mail);
break;
}
}
printf("请输入修改后的信息\n");
scanf("%s%s%ld%ld%s",&(p+j)->name,&(p+j)->hometown,&(p+j)->number[0],&(p+j)->number[1],&(p+j)->mail);
printf("%s\n",c);
printf("%d\n",j);
if(fwrite(&p[j],sizeof(struct contact_type),1,fp)!=1)
printf("file write error\n");
fclose(fp);
chon(n,fp,p);
}

void save()//文件输入
{
int i=0;
FILE *fp;
if((fp=fopen("con.dat","web"))==NULL)
{
printf("can not open file\n");
return ;
}
for(i=0;i<LEN;i++)
if(fwrite(&cont[i],sizeof(struct contact_type),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
int creat(int i,struct contact_type cont[LEN])//文件输入
{
char c;
printf("请依次输入姓名,籍贯,电话号码1,电话号码2,电子邮箱(中间用空格隔开,以! ! ! ! !结束输入):\n");
do
{
scanf("%s%s%ld%ld%s",&cont[i].name,&cont[i].hometown,&cont[i].number[0],&cont[i].number[1],&cont[i].mail);
i=i+1;
}
while(c=getchar()!='!');
fflush(stdin);//清除键盘缓冲区
save();
return (i);

}
int main()
{
FILE *fp;
int i=0,n=0,m=0;
struct contact_type *p;
p=cont;
n=creat(i,cont)-1;
if((fp=fopen("con.dat","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&cont[i],sizeof(struct contact_type),1,fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",cont[i].name,cont[i].hometown,cont[i].number[0],cont[i].number[1],cont[i].mail);
}
revise(n,p,fp);
fclose(fp);
if((fp=fopen("con.dat","rb"))==NULL)
{
printf("can not open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&cont[i],sizeof(struct contact_type),1,fp);
printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n",cont[i].name,cont[i].hometown,cont[i].number[0],cont[i].number[1],cont[i].mail);
}

return 0;

}

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-07-04 15:18
    关注

    修改完善如下,具体见注释,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define LEN 100
    struct contact_type
    {
        char name[10];
        char hometown[10];
        long number[2];
        char mail[10];
    }cont[LEN];
    //void show();
    void chon(int n, FILE* fp, struct contact_type* p)//重新写入
    {
        FILE* fp1;
        int i = 0;
        //fp = fopen("conn.dat", "r+");  // fopen("con.dat", "r+")
        fp1 = fopen("linshi.dat", "w+");//读写新建一个临时文件
        for (i = 0; i < n; i++)
        {
            fwrite(p + i, sizeof(struct contact_type), 1, fp);
            //fprintf(fp1, "%s%s%ld%ld%s\n", (p + i)->name, (p + i)->hometown,
            //    (p + i)->number[0], (p + i)->number[1], (p + i)->mail);
        }
        //fclose(fp);
        fclose(fp1);
        remove("conn.dat");  //remove("con.dat");
        rename("linshi.dat", "conn.dat");
    }
    void revise(int n, struct contact_type* p, FILE* fp)//文件修改
    {
        int i = 0, j = -1;
        char c[10];
        printf("请输入想要修改的对象姓名:\n");
        scanf("%s", c);
        //scanf("%s", &c);
        for (i = 0; i < n; i++)
        {
            if (strcmp(c, (p + i)->name) == 0)
            {
                j = i;
                printf("修改前信息:姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n", 
                    (p + i)->name, (p + i)->hometown, (p + i)->number[0], (p + i)->number[1], (p + i)->mail);
                break;
            }
        }
        if (j != -1 && j < n) {
            printf("请输入修改的信息(姓名 籍贯 电话号码1 电话号码2 电子邮箱):\n");
            scanf("%s%s%ld%ld%s", (p + j)->name, (p + j)->hometown,
                &(p + j)->number[0], &(p + j)->number[1], (p + j)->mail);
            //scanf("%s%s%ld%ld%s", &(p + j)->name, &(p + j)->hometown, 
            //&(p + j)->number[0], &(p + j)->number[1], &(p + j)->mail);
            printf("%s\n", c);
            printf("%d\n", j);
            //if (fwrite(&p[j], sizeof(struct contact_type), 1, fp) != 1)
            //    printf("file write error\n");
            //fclose(fp);
            chon(n, fp, p);
        }
        else
            printf("未找到相关记录!\n");
    }
    void save(int n)//文件输入
    {
        int i = 0;
        FILE* fp;
        if ((fp = fopen("conn.dat", "wb")) == NULL)
        //if ((fp = fopen("con.dat", "web")) == NULL)
        //DOS保留字,表示屏幕。如con 1.txt con就是把1.txt的内容显示在屏幕上。
        //(注意不能用con做文件名)
        {
            printf("can not open file\n");
            return;
        }
        for (i = 0; i < n; i++) {  //for (i = 0; i < LEN; i++)
            if (fwrite(&cont[i], sizeof(struct contact_type), 1, fp) != 1)
                printf("file write error\n");
        }
        fclose(fp);
    }
    int creat(int i, struct contact_type cont[])//文件输入
    {
        char c[10];
        printf("请依次输入姓名,籍贯,电话号码1,电话号码2,电子邮箱(中间用空格隔开,以! ! ! ! !结束输入):\n");
        while(1)  //do
        {
            scanf("%s", c);
            if (strcmp(c, "!") == 0)   break;
            strcpy(cont[i].name, c);
            scanf("%s%ld%ld%s", cont[i].hometown, &cont[i].number[0], &cont[i].number[1], cont[i].mail);
            //scanf("%s%s%ld%ld%s", &cont[i].name, &cont[i].hometown, &cont[i].number[0], &cont[i].number[1], &cont[i].mail);
            i = i + 1;
        } //while (c = getchar() != '!');
          //fflush(stdin);//清除键盘缓冲区
        save(i);
        return (i);
    }
    int main()
    {
        FILE* fp;
        int i = 0, n = 0, m = 0;
        struct contact_type* p;
        p = cont;
        n = creat(i, cont); //n = creat(i, cont) - 1;
        if ((fp = fopen("conn.dat", "rb")) == NULL)  
        //fp = fopen("con.dat", "rb") 不能用con做文件名
        {
            printf("can not open file\n");
            exit(0);
        }
        for (i = 0; i < n; i++)
        {
            fread(&cont[i], sizeof(struct contact_type), 1, fp);
            printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n", cont[i].name, 
                         cont[i].hometown, cont[i].number[0], cont[i].number[1], cont[i].mail);
        }
        fclose(fp);
        revise(n, p, fp);
        if ((fp = fopen("conn.dat", "rb")) == NULL)
            //fp = fopen("con.dat", "rb")
        {
            printf("can not open file\n");
            exit(0);
        }
        for (i = 0; i < n; i++)
        {
            fread(&cont[i], sizeof(struct contact_type), 1, fp);
            printf("姓名:%s 籍贯:%s 电话号码1:%ld 电话号码2:%ld 电子邮箱:%s\n", 
                cont[i].name, cont[i].hometown, cont[i].number[0], cont[i].number[1], cont[i].mail);
        }
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月12日
  • 已采纳回答 7月4日
  • 创建了问题 7月3日

悬赏问题

  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)