| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1896 人关注过本帖
标题:飞机场订票系统 无法按正确格式把新客户信息存进客户信息文件跟修改航班信息 ...
只看楼主 加入收藏
哈一
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-6-8
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:5 
飞机场订票系统 无法按正确格式把新客户信息存进客户信息文件跟修改航班信息文件里的余票额
跟同学一起合作写的飞机场系统。
航班信息存在一个单独的记事本里,订票客户信息存在另一个单独的记事本里。
现在我想完成的是输入航班号跟预定数量,然后判断是否可以成功订票,然后往客户信息记事本里新添加一个客户信息,并且修改航班记事本里该航班的余额。
航班跟客户信息都是用链表构建的。我现在就是可以添加客户信息进文本里,但是格式不对。然后修改航班信息的,程序运行完,文件里的信息全乱了,也没有格式。

以下是我的订票操作的代码。急切希望大神来教教我。或者帮我改改代码。

程序代码:
 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"plant.h"


struct Customerinformation *Creat()//构建客户信息链表
{
    struct Customerinformation*head,*p,*q;

    head=(struct Customerinformation*)malloc(sizeof(struct Customerinformation));
    head->next=NULL;
    q=head;
    p=(struct Customerinformation*)malloc(sizeof(struct Customerinformation));
    printf("订票的客户信息:\n姓名\t订票量\t舱位等级 座位号\n");
    scanf("%s\t%d\t%d\t%s\n",p->name,&p->number,&p->degree,p->seat);
    q->next=p;
    q=p;
    q->next=NULL;
    return(head);
}

/*数据存盘(wt只写)*/
void WriteData_wb(struct System *head) {
    FILE *fp;
    struct System *p;
    if((fp = fopen("D:/航班信息.txt", "wt"))==NULL)
       printf("\a error! Can not open the file!");
           p = head;
    while(p!=NULL) {
        if(fwrite(p,sizeof(struct System),1,fp)!=1) {
            printf("写入数据出错\n");
            fclose(fp);
            return;
        }
        p=p->next;
    }
    fclose(fp);
}
/*数据存盘(at追加)*/
void WriteData_ab(struct Customerinformation *head) {
    FILE *fp;
    struct Customerinformation *p;
    if((fp = fopen("D:/订票的客户信息.txt", "at"))==NULL)
    printf("\a error! Can not open the file!");
    p = head;
    while(p!=NULL) {
    if(fwrite(p,sizeof(struct Customerinformation),1,fp)!=1) {
            printf("写入数据出错\n");
            fclose(fp);
            return;
        }
        p=p->next;
    }
    printf("\a 已预定成功!");
    fclose(fp);
}

void dingpiao(struct System * head)/*根据旅客提出的航班号,订票数额查询并判断,然后订票*/
{
    struct System * p;
    p=head->next;
    char airname[N];
    int a;
    char b[N];

    printf("请输入您要预定的航班号\n");
    scanf("%s",airname);
    printf("请输入您要预定的数量\n");
    scanf("%d",&a);

    while(p!=NULL)
    {
        if((strcmp(airname,p->airnumber)==0))
        {
            if(p->Eticket<a)
            {
                printf("SORRY!\n");
                printf("此%s航班号仅仅剩余%d张票\n",p->airnumber,p->Eticket);
                //printf("是否要排队等待,如果要请输入Y,否则输入N");
                //scanf("%s",b);
                break;
            }
            if(p->Eticket>=a)
            {
                printf("此%s航班号剩余%d张票\n",p->airnumber,p->Eticket);
                printf("现在帮您预定\n");
                p->Eticket=(p->Eticket)-a;
                //WriteData_ab();//修改文件里航班的余票额
                //WriteData_wb(head);//往预订客户信息文件中添加新客户
                WriteData_ab(Creat());//往预订客户信息文件中添加新客户
                break;
            }

        }

        else
                p=p->next;
    }
    if(p==NULL)
        printf("系统中无此航班号信息");
}


图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 客户 信息 航班 struct printf 
2017-12-13 18:04
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
收藏
得分:10 
没看到plant.h的定义,另外你程序也没显示全。考虑是不是编译器的问题?
2017-12-13 18:35
哈一
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-6-8
收藏
得分:0 
回复 2楼 虫眼
编译器用的是Code Block
头文件就是链表里的内容呀。

程序代码:
 #ifndef PLANT_H_INCLUDED
#define PLANT_H_INCLUDED

#ifndef AIRPLANSYSTEM_H_INCLUDED
#define AIRPLANSYSTEM_H_INCLUDED

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
#define M 20
#define num 3
struct System//航班信息
{
    char airnumber[M];//航班号
    char airname[N];
    char Sstation[N];//起点站、
    char Fstation[N];//终点站、
    int quota;//定额
    int Eticket;//余票额
    char week[M];//星期几飞行
    char date[N];//时间:起飞时间.到达时间、
    struct System*next;
};
typedef struct System*Airline;

struct Customerinformation//订票的客户信息
{
    char name[M];//姓名
    int number;//订票量
    int degree;//舱位等级
    char seat[M];//座位号
    struct Customerinformation*next;

};


struct waitCustomer//
{
    char name[M];//姓名
    int number;//订票量
    struct waitCustomer*next;
};
struct System *read2();
void System();//航班信息
void bookingCustomer();//订票客户信息
void waitCustomer();//候补客户信息
void search(struct System * head);//查询航线
void dingpiao(struct System * head);


#endif // AIRPLANSYSTEM_H_INCLUDED


#endif // PLANT_H_INCLUDED
2017-12-13 18:46
GBH1
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:112
专家分:510
注 册:2017-6-13
收藏
得分:10 
void WriteData_wb(struct System *head) 函数文件打开模式是不是要用追加模式打开,你是的用写入模式打开的,这样航班信息始终只有一条。如果方便的话可以把所有代码贴出来,这样好调试
2017-12-13 20:20
哈一
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2017-6-8
收藏
得分:0 
回复 4楼 GBH1
好像知道问题在哪了,void WriteData_ab(struct Customerinformation *head)我这个函数确实是要写入,不是仅仅只是追加。
我想修改航班信息再写入(换句话说就只是想修改文件里的航班信息)
我超级方便的,我现在完整的贴出来,麻烦您帮我看看,具体怎么改。我不知道怎么动手改。

头文件
程序代码:
#ifndef PLANT_H_INCLUDED
#define PLANT_H_INCLUDED

#ifndef AIRPLANSYSTEM_H_INCLUDED
#define AIRPLANSYSTEM_H_INCLUDED

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 100
#define M 20
#define num 3
struct System//航班信息
{
    char airnumber[M];//航班号
    char airname[N];
    char Sstation[N];//起点站、
    char Fstation[N];//终点站、
    int quota;//定额
    int Eticket;//余票额
    char week[M];//星期几飞行
    char date[N];//时间:起飞时间.到达时间、
    struct System*next;
};
typedef struct System*Airline;

struct Customerinformation//订票的客户信息
{
    char name[M];//姓名
    int number;//订票量
    int degree;//舱位等级
    char seat[M];//座位号
    struct Customerinformation*next;

};


struct waitCustomer//
{
    char name[M];//姓名
    int number;//订票量
    struct waitCustomer*next;
};
struct System *read2();
void System();//航班信息
void bookingCustomer();//订票客户信息
void waitCustomer();//候补客户信息
void search(struct System * head);//查询航线
void dingpiao(struct System * head);


#endif // AIRPLANSYSTEM_H_INCLUDED


#endif // PLANT_H_INCLUDED


主函数
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"plant.h"


int main()
{
    struct System *head;
    head=read2();
    printf("\n\t\t航空客运订票系统\n");
    printf("******************************************\n");
    printf("       1.浏览航线信息\n");
    printf("       2.浏览已订票客户信息\n");
    printf("       3.浏览候补客户信息\n");
    printf("       4.查询航线\n");
    printf("       5.订票\n");
    printf("       6.办理退票业务\n");
    printf("       7.查看剩余票数并排序\n");
    printf("       0.退出系统\n");
    printf("*******************************************\n");
    int x;

    do{
        printf("\n请选择:");
        scanf("%d",&x);
        switch(x)
        {
            case 1:System();break;
            case 2:bookingCustomer();break;
            case 3:waitCustomer();break;
            case 4:search(head);break;
            case 5:dingpiao(head);break;
            case 0:printf("\n欢迎使用本系统,再见!\n");
            exit(0);
        }
    }while(x!=0);
}


void System();//航班信息
void bookingCustomer();//订票客户信息
void waitCustomer();//候补客户信息
这三个都是一个模版出来的,就运用的链表不一样而已。
我在这里先贴出订票客户信息void bookingCustomer();//订票客户信息
预定客户信息
程序代码:
#include"plant.h"


struct Customerinformation*read()//从文件读取到链表
{
    struct Customerinformation*head,*p,*q;
    head=(struct Customerinformation*)malloc(sizeof(struct Customerinformation));
    head->next=NULL;
    q=head;
    FILE*fp;
    if((fp=fopen("D:/订票的客户信息.txt","rb"))==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }

    while(!feof(fp))
    {
        p=(struct Customerinformation*)malloc(sizeof(struct Customerinformation));

        fscanf(fp,"%s\t%d\t%d\t%s\n",p->name,&p->number,&p->degree,p->seat);

        q->next=p;
        q=p;
    }
    q->next=NULL;
    fclose(fp);
   return head;

}

void bookingCustomer()//订票客户的信息
{
    struct Customerinformation*head,*p;
    head=read();
    p=head->next;
    printf("订票的客户信息:\n姓名\t订票量\t舱位等级 座位号\n");
    while(p!=NULL)
    {
        printf("%s\t%d\t%d\t%s\n",p->name,p->number,p->degree,p->seat);
       p=p->next;
    }

}


查询
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"plant.h"



void search(struct System * head)/*根据旅客提出的终点站名输出下列信息:
航班号、飞机号、星期几飞行、剩余票额等信息。*/
{
    struct System * p;
    p=head->next;
    char name[N];

    printf("请输入您要查找的终点站:\n");
    scanf("%s",name);
    while(p!=NULL)
    {
        if(strcmp(name,p->Fstation)==0)
            {
                printf("航班号\t飞机号\t星期 \t剩余票额\n");
                printf("%s\t%s\t%s\t%d\n",p->airnumber,p->airname,p->week,p->Eticket);
                break;
            }
        else
                p=p->next;
    }
    if(p==NULL)
        printf("您输入的终点站有误!!");
}
2017-12-13 20:38
GBH1
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:112
专家分:510
注 册:2017-6-13
收藏
得分:0 
struct Customerinformation*read()//从文件读取到链表
{
    struct Customerinformation*head,*p,*q;
    head=(struct Customerinformation*)malloc(sizeof(struct Customerinformation));
    head->next=NULL;
    q=head;
    FILE*fp;
    if((fp=fopen("D:/订票的客户信息.txt","rb"))==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }

   // while(!feof(fp))
    {
        p=(struct Customerinformation*)malloc(sizeof(struct Customerinformation));

        fscanf(fp,"%s\t%d\t%d\t%s\n",p->name,&p->number,&p->degree,p->seat);

        q->next=p;
        q=p;
    }
    q->next=NULL;
    fclose(fp);
   return head;

}

可能是while循环条件,看你之前的写入文件函数都是一整个结构体一整个结构体写入的,所以你是是读取的时候整个结构体一起读。while条件改成fread(...)==1,不要用feof函数,我觉得可能文件末尾结束符不一定是eof。你可以先试试。
2017-12-16 00:26
快速回复:飞机场订票系统 无法按正确格式把新客户信息存进客户信息文件跟修改航 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021385 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved