|
10鱼币
本帖最后由 未来丶梦而已 于 2013-12-13 00:43 编辑
main.cpp
- #include<windows.h>
- #include "Updata.h"
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM) ;
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
- PSTR szCmdLine, int iCmdShow)
- {
- static TCHAR szAppName[] = TEXT("SysMets1");
- HWND hwnd;
- MSG msg;
- WNDCLASS wndclass;
- wndclass.style = CS_HREDRAW | CS_VREDRAW;
- wndclass.lpfnWndProc = WndProc;
- wndclass.cbClsExtra = 0;
- wndclass.cbWndExtra = 0;
- wndclass.hInstance = hInstance;
- wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
- wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
- wndclass.lpszMenuName = NULL;
- wndclass.lpszClassName = szAppName;
- if(!RegisterClass (&wndclass))
- {
- MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
- return 0;
- }
- hwnd = CreateWindow(szAppName, TEXT("Get System Metrics No.1"),
- WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT,
- CW_USEDEFAULT, CW_USEDEFAULT,
- NULL, NULL, hInstance, NULL);
- ShowWindow(hwnd, iCmdShow);
- UpdateWindow(hwnd);
- while(GetMessage (&msg, NULL,0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
- LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- static int cxChar, cxCaps, cyChar,cyClient, iVscrollPos;
- HDC hdc;
- int i, y;
- PAINTSTRUCT ps;
- TEXTMETRIC tm;
- Engieer engieerTemp;
- Leader leaderTemp;
- Chairman chairmanTemp;
- switch(message)
- {
- case WM_CREATE:
- hdc = GetDC(hwnd);
- GetTextMetrics(hdc, &tm);
- cxChar = tm.tmAveCharWidth;
- cxCaps = (tm.tmPitchAndFamily& 1 ? 3 : 2)*cxChar /2;
- cyChar = tm.tmHeight + tm.tmExternalLeading;
- ReleaseDC (hwnd, hdc);
- SetScrollRange(hwnd, SB_VERT, 0, count, FALSE);
- SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
- return 0;
- case WM_SIZE:
- cyClient = HIWORD(lParam);
- return 0;
- case WM_VSCROLL:
- switch(LOWORD (wParam))
- {
- case SB_LINEUP:
- iVscrollPos -= 1;
- break;
- case SB_LINEDOWN:
- iVscrollPos += 1;
- break;
- case SB_PAGEUP:
- iVscrollPos -= cyClient / cyChar;
- break;
- case SB_PAGEDOWN:
- iVscrollPos += cyClient / cyChar;
- case SB_THUMBPOSITION:
- iVscrollPos = HIWORD (wParam);
- break;
- default:
- break;
- }
- iVscrollPos = max(0, min (iVscrollPos, count));
- if(iVscrollPos != GetScrollPos (hwnd, SB_VERT))
- {
- SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
- InvalidateRect(hwnd, NULL, TRUE);
- }
- return 0;
- case WM_PAINT:
- hdc = BeginPaint (hwnd, &ps);
- Init();
- for( i = 0; i < count; i++)
- {
- y = cyChar * (i - iVscrollPos + 1);
- int temp1, temp2;
- int *ptr = allfind(i);
- temp1 = *ptr++;
- temp2 = *ptr;
- if(temp1 == 1)
- {
- engieerTemp = EGet(temp2);
- TextOut (hdc, 0, y,
- engieerTemp.GetNum(),
- lstrlen(engieerTemp.GetNum()));
- TextOut (hdc, 10 * cxChar, y,
- engieerTemp.GetName(),
- lstrlen(engieerTemp.GetName()));
- TextOut (hdc, 20 * cxChar , y,
- engieerTemp.GetAge(),
- lstrlen(engieerTemp.GetAge()));
- }
- else if(temp1 == 2)
- {
- leaderTemp = LGet(temp2);
- TextOut (hdc, 0, y,
- leaderTemp.GetNum(),
- lstrlen(leaderTemp.GetNum())
- );
- }
- else if(temp1 == 3)
- {
- chairmanTemp = CGet(temp2);
- TextOut (hdc, 0, y,
- chairmanTemp.GetNum(),
- lstrlen(leaderTemp.GetNum())
- );
- }
- }
- EndPaint(hwnd, &ps);
- return 0;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc (hwnd, message, wParam, lParam);
- }
复制代码 classbasic.h
Updata.h
- #include<iostream>
- #include<fstream>
- #define Index_menber 1000;
- #include"classbasic.h"
- using namespace std;
- int counttemp = 0;
- int count = 0;
- fstream file;
- struct IndexType
- {
- bool delTag; //删除标志
- char num[8]; //编号
- int positiong; //在数据文件中的相对位置
- char staffType; //人员类型, e:工程师, 1:领导, c:主任工程师
- };
- class StaffManage
- {
- private:
- IndexType *indexTable; //索引表
- int maxSize; //索引表最大索引项目个数
- public:
- void AddIndexItem(const IndexType &e); //在索引中增加索引项
- void AddData(); //增加数据
- void SearchData(); //查询数据
- void DeleteData(); //删除数据,只做删除标志
- void Delete();
- void Update();
- void Adde();
- void Addl();
- void Addc();
- void Searche(int j);
- void Searchl(int p);
- void Searchc(int q);
- void Deletee(int i);
- void Deletel(int p);
- void Deletec(int q);
- StaffManage();
- ~StaffManage();
- };
- StaffManage::StaffManage() //管理类构造函数
- {
- ifstream indexFile("Staff.idx", ios::binary); //建立输入索引文件
- if(!indexFile.fail())
- {
- int i = 0;
- indexFile.seekg(0, ios::end); //指向文件尾
- count = indexFile.tellg() / sizeof(IndexType); //索引项个数
- maxSize = count +Index_menber;
- indexTable = new IndexType[maxSize];
- indexFile.seekg(0, ios::beg);
- indexFile.read(reinterpret_cast<char *>(&indexTable[i++]), sizeof(IndexType));
- while(!indexFile.eof())
- {
- indexFile.read(reinterpret_cast<char *>(&indexTable[i++]), sizeof(IndexType));
- }
- indexFile.close();
- }
- else //对于本地没有索引文件。对索引文件的初始化
- {
- count = 0;
- maxSize = count + Index_menber;
- indexTable = new IndexType[maxSize];
- }
- ifstream iFile("staffdata.dat"); //检查是否存在数据文件
- if(iFile.fail())
- {
- ofstream oFile("staffdata.dat"); //建立数据文件
- if(oFile.fail())
- {
- cout<<"打开文件失败"<<endl;
- oFile.close();
- }
- }
- else
- {
- iFile.close();
- }
- file.open("staffdata.dat", ios::in | ios::out | ios::binary); //以读写二进制的方式打开数据文件。并hold住
- if(file.fail())
- {
- cout<<"数据文件"<<endl;
- }
- }
- StaffManage::~StaffManage() //析构函数,当用户正常退出时。将数据输入索引文件
- {
- ofstream indexFile("staff.idx",ios::binary);
- for(int i = 0; i < count; i++)
- {
- indexFile.write(reinterpret_cast<char *> (&indexTable[i]), sizeof(IndexType));
- }
- indexFile.close();
- file.close();
- }
- void StaffManage::AddIndexItem(const IndexType &e) //增加索引表函数
- {
- if( count >maxSize||count == maxSize)
- {
- maxSize = maxSize + Index_menber;
- IndexType * tempIndeTable = new IndexType[maxSize];
- for(int i = 0; i < count ; i++)
- {
- tempIndeTable[i] = indexTable[i];
- }
- delete []indexTable;
- indexTable = tempIndeTable;
- }
- indexTable[count++] = e;
- }
- void StaffManage::AddData() //增加数据函数
- {
- char nice;
- cout<<"人员类型(e:工程师,l:领导,c:主任工程师): ";
- cin>>nice;
- switch(nice)
- {
- case 'e':
- case 'E':Adde();
- break;
- case 'l':
- case 'L':Addl();
- break;
- case 'c':
- case 'C':Addc();
- break;
- }
- }
- void StaffManage::Adde()
- {
- Engieer pStaff;
- IndexType item;
- item.staffType = 'e';
- item.delTag = false;
- file.seekg(0, ios::end);
- pStaff.Input();
- strcpy(item.num, pStaff.GetNum());
- item.positiong = file.tellg();
- AddIndexItem(item);
- pStaff.Write(file);
- }
- void StaffManage::Addl()
- {
- Chairman pStaff;
- IndexType item;
- item.staffType = 'l';
- item.delTag = false;
- file.seekg(0, ios::end);
- pStaff.Input();
- strcpy(item.num, pStaff.GetNum());
- item.positiong = file.tellg();
- AddIndexItem(item);
- pStaff.Write(file);
- }
- void StaffManage::Addc()
- {
- Leader pStaff;
- IndexType item;
- item.staffType = 'c';
- item.delTag = false;
- file.seekg(0, ios::end);
- pStaff.Input();
- strcpy(item.num, pStaff.GetNum());
- item.positiong = file.tellg();
- AddIndexItem(item);
- pStaff.Write(file);
- }
- Engieer StaffManage::Searche(int j)
- {
- Engieer pStaff;
- file.seekg(indexTable[j].positiong, ios::beg);
- pStaff.Read(file);
- return pStaff;
- }
- void StaffManage::Searchl(int p)
- {
- Leader pStaff;
- file.seekg(indexTable[p].positiong, ios::beg);
- pStaff.Read(file);
- pStaff.Show();
- }
- void StaffManage::Searchc(int q)
- {
- Chairman pStaff;
- file.seekg(indexTable[q].positiong, ios::beg);
- pStaff.Read(file);
- pStaff.Show();
- }
- void StaffManage::SearchData() //查找数据函数
- {
- IndexType itemTemp;
- int j = 1;
- cout<<"请输入编号: "<<endl;
- cin>>itemTemp.num;
- for(int i = 0; i < count; i++)
- {
- if( 0==strcmp(indexTable[i].num, itemTemp.num))
- {
- cout<<"找到该人!"<<endl;
- j = 0;
- if(indexTable[i].staffType == 'e')
- {
- Searche(i);
- }
- else if(indexTable[i].staffType=='l')
- {
- Searchl(i);
- }
- else if(indexTable[i].staffType == 'c')
- {
- Searchc(i);
- }
- break;
- }
- }
- if(j)
- {
- cout<<"此人不存在."<<endl;
- }
- }
- void StaffManage::Deletee(int i)
- {
- Engieer pStaff;
- file.seekg(indexTable[i].positiong,ios::beg);
- pStaff.Read(file);
- fstream outFile("temp.dat",ios::app|ios::binary);
- outFile.seekg(0, ios::end);
- indexTable[counttemp++].positiong = outFile.tellg();
- pStaff.Write(outFile);
- outFile.close();
- }
- void StaffManage::Deletel(int p)
- {
- Leader pStaff;
- file.seekg(indexTable[p].positiong,ios::beg);
- pStaff.Read(file);
- fstream outFile("temp.dat",ios::app|ios::binary);
- outFile.seekg(0, ios::end);
- indexTable[counttemp++].positiong = outFile.tellg();
- pStaff.Write(outFile);
- outFile.close();
- }
- void StaffManage::Deletec(int q)
- {
- Chairman pStaff;
- file.seekg(indexTable[q].positiong,ios::beg);
- pStaff.Read(file);
- fstream outFile("temp.dat",ios::app|ios::binary);
- outFile.seekg(0, ios::end);
- indexTable[counttemp++].positiong = outFile.tellg();
- pStaff.Write(outFile);
- outFile.close();
- }
- void StaffManage::Delete() //删除函数
- {
- IndexType itemTemp;
- int j = 1;
- cout<<"请输入要删除的人员编号: "<<endl;
- cin>>itemTemp.num;
- for(int i = 0; i < count; i++)
- {
- if( 0==strcmp(indexTable[i].num, itemTemp.num))
- {
- cout<<"找到该人, 正在删除数据....."<<endl;
- indexTable[i].delTag = true;
- DeleteData();
- j = 0;
- break;
- }
- }
- if(j)
- {
- cout<<"此人不存在."<<endl;
- }
- }
- void StaffManage::DeleteData() //对数据的实际删除
- {
- ofstream oFile("temp.dat");
- oFile.close();
- int error = 0;
- for(int i = 0; i < count; i++)
- {
- if( indexTable[i].delTag == false )
- {
- if(indexTable[i].staffType == 'e')
- {
- strcpy(indexTable[i-error].num, indexTable[i].num);
- indexTable[i-error].delTag =false;
- indexTable[i-error].staffType= 'e';
- Deletee(i-1);
- }
- else if(indexTable[i].staffType=='l')
- {
- strcpy(indexTable[i-error].num, indexTable[i].num);
- indexTable[i-error].delTag =false;
- indexTable[i-error].staffType= 'l';
- Deletel(i-1);
- }
- else if(indexTable[i].staffType == 'c')
- {
- strcpy(indexTable[i-error].num, indexTable[i].num);
- indexTable[i-error].delTag =false;
- indexTable[i-error].staffType= 'c';
- Deletec(i-1);
- }
- }
- else
- {
- error++;
- }
- }
- count = counttemp;
- counttemp = 0;
- file.close();
- remove("staffdata.dat");
- rename("temp.dat","staffdata.dat");
- file.open("staffdata.dat",ios::in|ios::out|ios::binary);
- cout<<"删除成功."<<endl;
- }
- Engieer EGet(int pos)
- {
- Engieer pStaff;
- file.seekg(pos, ios::beg);
- pStaff.Read(file);
- return pStaff;
- }
- Leader LGet(int pos)
- {
- Leader pStaff;
- file.seekg(pos, ios::beg);
- pStaff.Read(file);
- return pStaff;
- }
- Chairman CGet(int pos)
- {
- Chairman pStaff;
- fstream file1;
- file1.open("staffdata.dat", ios::in | ios::binary);
- file1.seekg(pos, ios::beg);
- pStaff.Read(file1);
- file1.close();
- return pStaff;
- }
- int * allfind(int i)
- {
- static int j[2];
- IndexType *indexTable;
- ifstream indexFile1("Staff.idx", ios::binary);
- if(!indexFile1.fail())
- {
- int p = 0;
- int maxSize;
- indexFile1.seekg(0, ios::end); //指向文件尾
- maxSize = count +Index_menber;
- indexTable = new IndexType[maxSize];
- indexFile1.seekg(0, ios::beg);
- indexFile1.read(reinterpret_cast<TCHAR *>(&indexTable[p++]), sizeof(IndexType));
- while(!indexFile1.eof())
- {
- indexFile1.read(reinterpret_cast<TCHAR *>(&indexTable[p++]), sizeof(IndexType));
- }
- indexFile1.close();
- }
- if(indexTable[i].staffType == 'e')
- {
- j[0] = 1;
- j[1] = indexTable[i].positiong;
- }
- else if(indexTable[i].staffType=='l')
- {
- j[0] = 2;
- j[1] = indexTable[i].positiong;
- }
- else if(indexTable[i].staffType == 'c')
- {
- j[0] = 3;
- j[1] = indexTable[i].positiong;
- }
- return j;
- }
- void Init()
- {
- StaffManage a;
- }
复制代码 本来是写控制台的。控制台的代码也放一起了。
我想知道为什么用控制台调用Searche函数读文件数据的时候没问题
我想做界面写的EGet函数读文件数据的时候总是读不到正确的数据。
困扰了我很久了。新手写得有的乱。
希望有大虾帮看看。谢谢了。
|
最佳答案
查看完整内容
我給你advice你, 不要post那麼多的code上來,because no one wants to read such a long code.
I suggest you 可以先自己分析,把核心比較少的部份提出來,比較efficient。
|