Сбой при редактировании записей - PullRequest
0 голосов
/ 04 мая 2011

Я должен сделать проект C ++ в Visual Basic 6.0 с графическим интерфейсом. Проект представляет собой экзаменационную базу данных для студентов. Функциональность этой программы заключается в том, что она добавляет записи и показывает записи, а также распечатывает бланк для сдачи экзаменов для студентов.

Я сделал некоторые его части, но я не могу добавить записи в файл db.dat. Я сделал несколько меню и диалоговых окон для добавления, удаления и просмотра записей, но только открытое диалоговое окно добавления, и оно также не работает должным образом. и не сохраняйте данные в файле во время удаления или изменения программы записи. я не понимаю, что делать, пожалуйста, помогите мне. Код программы ниже:

#include "afxwin.h"
#include "resource.h"

struct student
{
    char name[25];
    char address[40];
    char college[10];
    unsigned long int phone_no;
    unsigned int batch_no;
    char course[2];
    char start_date[10];
    char class_timings[15];
    char computer_timings[15];
    float total_fees;
    float first_inst;
    float second_inst;
    float balance;
};

CFile fp("student.dat",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);

CString g_name;
unsigned int g_batchno;

class about_dialog: public CDialog
{
public:
    about_dialog():CDialog (IDD_DIALOG1)
    {}
};

class add_dialog: public CDialog
{
private:
    struct student e;
    CString s[7];

    public:

        add_dialog():CDialog(IDD_DIALOG2)
        {
            e.phone_no=e.batch_no=0;
            e.total_fees=e.first_inst=0.0;
            e.second_inst=e.balance=0.0;
        }

        void DoDataExchange(CDataExchange *p)
        {
            DDX_Text(p,IDC_EDIT1,s[0]);
            DDX_Text(p,IDC_EDIT2,s[1]);
            DDX_Text(p,IDC_EDIT4,s[2]);
            DDX_Text(p,IDC_EDIT5,e.phone_no);
            DDX_Text(p,IDC_EDIT6,e.batch_no);
            DDX_Text(p,IDC_COMBO5,s[3]);
            DDX_Text(p,IDC_EDIT7,s[4]);
            DDX_Text(p,IDC_COMBO6,s[5]);
            DDX_Text(p,IDC_COMBO7,s[6]);
            DDX_Text(p,IDC_EDIT3,e.total_fees);
            DDX_Text(p,IDC_EDIT8,e.first_inst);
            DDX_Text(p,IDC_EDIT9,e.second_inst);
            DDX_Text(p,IDC_EDIT10,e.balance);
        }

        void save()
        {
            CDialog::OnOK();

            strcpy(e.name,s[0]);
            strcpy(e.college,s[1]);
            strcpy(e.address,s[2]);
            strcpy(e.course,s[3]);
            strcpy(e.start_date,s[4]);
            strcpy(e.class_timings,s[5]);
            strcpy(e.computer_timings,s[6]);

            fp.SeekToEnd();
            fp.Write(&e,sizeof(e));
        }

    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(add_dialog,CDialog)
ON_COMMAND(601,save)
END_MESSAGE_MAP()

class getname_dialog: public CDialog
{
public:
    getname_dialog(): CDialog(IDD_DIALOG3)
    {
        g_name="";
        g_batchno=0;
    }

    void DoDataExchange(CDataExchange *p)
    {
        DDX_Text(p,IDC_EDIT1,g_batchno);
        DDX_Text(p,IDC_EDIT2,g_name);
    }
};

class modify_dialog: public CDialog
{
private:

    CString s[7];
    struct student e;

    public:

        modify_dialog(struct student ee):CDialog (IDD_DIALOG2)
        {
            e=ee;
            s[0]=ee.name;
            s[1]=ee.college;
            s[2]=ee.address;
            s[3]=ee.course;
            s[4]=ee.start_date;
            s[5]=ee.class_timings;
            s[6]=ee.computer_timings;
        }

        void DoDataExchange(CDataExchange *p)
        {
            DDX_Text(p,IDC_EDIT1,s[0]);
            DDX_Text(p,IDC_EDIT2,s[1]);
            DDX_Text(p,IDC_EDIT4,s[2]);
            DDX_Text(p,IDC_EDIT5,e.phone_no);
            DDX_Text(p,IDC_EDIT6,e.batch_no);
            DDX_Text(p,IDC_COMBO5,s[3]);
            DDX_Text(p,IDC_EDIT7,s[4]);
            DDX_Text(p,IDC_COMBO6,s[5]);
            DDX_Text(p,IDC_COMBO7,s[6]);
            DDX_Text(p,IDC_EDIT3,e.total_fees);
            DDX_Text(p,IDC_EDIT8,e.first_inst);
            DDX_Text(p,IDC_EDIT9,e.second_inst);
            DDX_Text(p,IDC_EDIT10,e.balance);
        }

        void save()
        {
            CDialog::OnOK();

            strcpy(e.name,s[0]);
            strcpy(e.college,s[1]);
            strcpy(e.address,s[2]);
            strcpy(e.course,s[3]);
            strcpy(e.start_date,s[4]);
            strcpy(e.class_timings,s[5]);
            strcpy(e.computer_timings,s[6]);

            fp.Seek(-(long)sizeof(e),CFile::current);
            fp.Write(&e,sizeof(e));
        }

DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(modify_dialog,CDialog)
ON_COMMAND(601,save)
END_MESSAGE_MAP()

class myframe: public CFrameWnd
{
public:
    myframe()
    {
        CString mywindowclass;

        CBrush mybrush;
        mybrush.CreateSolidBrush(RGB(225,255,255));

        mywindowclass=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW,AfxGetApp()->LoadStandardCursor(IDC_ARROW),mybrush,AfxGetApp()->LoadIcon(IDI_ICON1));

        Create(mywindowclass,"DATABASE",WS_OVERLAPPEDWINDOW,rectDefault,0,MAKEINTRESOURCE(IDR_MENU1));

    }

    void about()
    {
        about_dialog diag;
        diag.DoModal();
    }

    void addrec()
    {
        Invalidate();
        add_dialog diag;
        diag.DoModal();

    }

    void byname()
    {
        struct student e;

        CClientDC d(this);
        CRect r;
        int y;

        char str[80];
        fp.SeekToBegin();
        y=0;

        GetClientRect(&r);

        CBrush mybrush (RGB(255,255,255));

        d.FillRect(&r,&mybrush);

        while(fp.Read(&e,sizeof(e))>=sizeof(e))
        {
            sprintf(str,"%-25s %-40s",e.name,e.address);

            d.TextOut(0,y,str,strlen(str));

            y+=15;
        }
    }

    void college()
    {
        struct student e;

        CClientDC d(this);

        int y;
        char str[90];
        CRect r;

        GetClientRect(&r);
        CBrush mybrush(RGB(255,255,255));
        d.FillRect(&r,&mybrush);

        fp.SeekToBegin();
        y=0;

        while(fp.Read(&e,sizeof(e))>=sizeof(e))
        {
            sprintf(str,"%-25s %-20s %-6u %-10s",e.name, e.course,e.batch_no,e.college);
            d.TextOut(0,y,str,strlen(str));
            y+=15;
        }

    }

    void batch()
    {
        struct student e;

        CClientDC d(this);

        int y;
        char str[90];
        CRect r;

        GetClientRect(&r);
        CBrush mybrush(RGB(255,255,255));
        d.FillRect(&r,&mybrush);

        fp.SeekToBegin();
        y=0;

        while(fp.Read(&e,sizeof(e))>=sizeof(e))
        {
            sprintf(str,"%-25s %-20s %-15s %-15s",e.name,e.course,e.class_timings,e.computer_timings);
            d.TextOut(0,y,str,strlen(str));
            y+=15;
        }
    }

    void defaulters()
    {
        struct student e;

        CClientDC d(this);

        int y;
        char str[90];
        CRect r;

        GetClientRect(&r);
        CBrush mybrush(RGB(255,255,255));
        d.FillRect(&r,&mybrush);

        fp.SeekToBegin();
        y=0;

        while(fp.Read(&e,sizeof(e))>=sizeof(e))
        {
            if(e.balance>0)
            {
                sprintf(str,"%-25s %-20s %-6.6f %-6.6f %-6.6f",e.name,e.course,e.first_inst,e.second_inst,e.balance);
                d.TextOut(0,y,str,strlen(str));
                y+=15;      
            }
        }
    }

    void modifyrec()
    {
        Invalidate();

        bool found;
        struct student e;

        getname_dialog diag;

        if(diag.DoModal()==IDOK)
        {
            found=false;
            fp.SeekToBegin();

            while(fp.Read(&e,sizeof(e))>=sizeof(e))
            {
                if(e.batch_no==g_batchno && strcmp(e.name,g_name)==0)
                {
                    found=true;
                    break;
                }
            }

            if(found==true)
            {
                modify_dialog mdiag(e);
                mdiag.DoModal();
            }
            else
                MessageBox("Record Not Found","Modify Record");
        }
    }

    void delrec()
    {
        bool found;
        struct student e;

        Invalidate();
        getname_dialog diag;
        if(diag.DoModal()==IDOK)
        {
            found=false;
            fp.SeekToBegin();

            CFile ft("temp.dat",CFile::modeCreate|CFile::modeWrite);

            while(fp.Read(&e,sizeof(e))>=sizeof(e))
            {
                if(e.batch_no==g_batchno && strcmp(e.name,g_name)==0)

                    found=true;
                else
                    ft.Write(&e,sizeof(e));
            }
            if(found==false)
                MessageBox("Record Not Found","Delete Record");
            fp.Close();
            ft.Close();

            CFile::Remove("students.dat");
            CFile::Rename("temp.dat","students.dat");
            fp.Open("student.dat",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite);
        }
    }
    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(myframe,CFrameWnd)

ON_COMMAND(101,about)
ON_COMMAND(201,addrec)
ON_COMMAND(301,byname)
ON_COMMAND(302,college)
ON_COMMAND(303,batch)
ON_COMMAND(304,defaulters)
ON_COMMAND(401,modifyrec)
ON_COMMAND(501,delrec)

END_MESSAGE_MAP()

class myapp: public CWinApp
{
    public:

        int InitInstance()
        {
            myframe *fr;
            fr=new myframe;
            fr->ShowWindow(SW_SHOWMAXIMIZED);
            m_pMainWnd=fr;

            return 1;
        }
};

myapp app;

Ответы [ 2 ]

0 голосов
/ 04 мая 2011

Вы уверены, что add_dialog :: save () вызывается, учитывая объявление ON_COMMAND (601, save)?

Убедитесь, что операции ввода-вывода на fp выполнены успешно, проверив состояние возврата. Пример: если открыть файл не удалось, попытки записи в него будут безуспешными. Смотри http://msdn.microsoft.com/en-us/library/3d65ch27(v=VS.80).aspx

И так как вы отметили это домашнее задание: я бы предложил обернуть CFile в новый класс (CStudentDB?). Вы можете поместить все детали ввода / вывода в этот класс, написать и отладить его только один раз и предложить более простой интерфейс (пример: while (studentDB.Read(e)) {..}) для GUI-части вашей программы.

0 голосов
/ 04 мая 2011
  Object P;
            int pos=sizeof(Object)*PID-sizeof(Object);
            f.open("File.dat",ios::in|ios::out|ios::binary|ios::ate);
            f.seekp(0,ios::beg);
            f.seekp(pos,ios::cur);
            f.read((char*)&P,sizeof(Object));
            f.close();
            return 0;

в этом подходе я пишу объекты в файл ... его легко искать и извлекать данные .. попробуйте этот подход ... также не пишите strings в файлы, которые выдают ошибки ввода-вывода ... используйте массивы символов для

...