ID LNAME FNAME AGE SALORY
10伊万诺夫·伊万25 3000
彼得罗夫20彼得22 3200
всеполяразделеныоднимпробелом
Разработайтепрограмму,осуществляющуючтениеуказанногофайла,дляхраненияданныхиспользуйтединамическиймассив,реализуйтеф-циидобавленияиудаленияэлементов。 Результатпреобразованиясохранитевдвоичномфайле。请在fstream和stdioнавыбор上进行操作。Дляработысфайломиспользуйтеф-циибиблиотеки。 Длязаданияконстантныхзначенийиспользуйтедирективу定义。 Описаниепользовательскихф-цийрасположитевотдельныхфайлах
。c /。h
Программадолжнапредоставлятьпользователювозможностьвводаданныхсотрудника,атакжеименивходногоивыходногофайла,вслучаеневозможностиегооткрытия - предупреждатьпользователя,выводясообщениеспредложениемповторноговводалибозавершенияработы。#include <iostream>
#include <fstream>
#include <string>
#include "DynArray.h"
#include "BaseRec.h"
using namespace std;
int main(void)
{
string fileName;
ifstream fi;
while(true){
cout << "Enter file name or * for exit" << endl << ":";
getline(cin, fileName);
if("*"==fileName){
cout << "Goodbye";
return 0;
}
fi.open(fileName);
if(fi.is_open())
break;
else
cout << "Cannot open input file." << endl;
};
SArray list;
ArrayInit(list);
BaseRecReadHeader(fi);
while(!fi.eof())
ArrayAdd(list, (void*)BaseRecReadRec(fi));
fi.close();
cout << "Input file is read."<<endl;
int tmp;
while(1){
cout << "Enter new record ID or 0 to save records"<< endl<<":";
cin >> tmp;
if(cin.fail()){
cin.clear();
cin.ignore(32767, '\n');
cout << " The input is invalid."<<endl;
continue;
}
cin.ignore(32767, '\n');
if(0==tmp)
break;
SBaseRec* rec=new SBaseRec;
rec->ID=tmp;
cout << "Enter new record LNAME"<< endl<<":";
cin.getline(rec->LNAME, 32);
cout << "Enter new record FNAME"<< endl<<":";
cin.getline(rec->FNAME, 32);
cout << "Enter new record AGE"<< endl<<":";
cin >> rec->AGE;
cin.ignore(32767, '\n');
cout << "Enter new record SALARY"<< endl<<":";
cin >> rec->SALARY;
cin.ignore(32767, '\n');
ArrayAdd(list, (void*)rec);
}
ofstream fo;
while(true){
cout << "Enter file name to save data or * for exit" << endl << ":";
getline(cin, fileName);
if("*"==fileName){
cout << "Goodbye";
return 0;
}
fo.open(fileName, ios::binary);
if(fo.is_open())
break;
else
cout << "Cannot open output file." << endl;
};
int i=0;
void* data;
while(data=ArrayGet(list,i++)) {
BaseRecPrint((SBaseRec*)data);
fo.write((const char*)data, sizeof(SBaseRec));
};
fo.close();
ArrayDelete(list);
cout << "Goodbye" << endl;
system("pause");
return 0;
}
BaseRec.h
#ifndef BASEREC_H #define BASEREC_H #include <fstream> using namespace std; typedef struct BaseRec { unsigned int ID; char LNAME[32]; char FNAME[32]; unsigned int AGE; unsigned int SALARY; } SBaseRec; void BaseRecPrint(SBaseRec* rec); string BaseRecReadHeader(ifstream& fi); SBaseRec* BaseRecReadRec(ifstream& fi); bool BaseRecEqualAGE(void* rec, void* age); bool BaseRecEqualLNAME(void* rec, void* name); int BaseRecCompareAGE(void* rec1, void* rec2); int BaseRecCompareLNAME(void* rec1, void* rec2); #endif
BaseRec.cpp
#include <iostream> #include <fstream> #include <string> #include "BaseRec.h" using namespace std; void BaseRecPrint(SBaseRec* rec) { cout << rec->ID << '\t'; cout << rec->LNAME << '\t'; cout << rec->FNAME << '\t'; cout << rec->AGE << '\t'; cout << rec->SALARY << endl; } string BaseRecReadHeader(ifstream& fi) { string str; getline(fi, str); return str; } SBaseRec* BaseRecReadRec(ifstream& fi) { unsigned int tmp; fi >> tmp; if(fi.fail()){ fi.clear(); return NULL; } SBaseRec* rec=new SBaseRec; rec->ID=tmp; fi.ignore(32767,' '); fi.getline(rec->LNAME, 32, ' '); fi.getline(rec->FNAME,32,' '); fi >> rec->AGE >> rec->SALARY; fi.ignore(32767,'\n'); return rec; } bool BaseRecEqualAGE(void* rec, void* age) { int r=((SBaseRec*)rec)->AGE; int v=*((unsigned int*)age); return r == v; } bool BaseRecEqualLNAME(void* rec, void* name) { string s; s=string(((SBaseRec*)rec)->LNAME); return 0 == s.compare((const char*)name); } int BaseRecCompareAGE(void* rec1, void* rec2) { int a1=((SBaseRec*)rec1)->AGE; int a2=((SBaseRec*)rec2)->AGE; if( a1 > a2 ) return 1; else if( a1 < a2 ) return -1; else return 0; } int BaseRecCompareLNAME(void* rec1, void* rec2) { string s; s=string(((SBaseRec*)rec1)->LNAME); return s.compare(((SBaseRec*)rec2)->LNAME); }
DynArray.h
#ifndef DynArrayH #define DynArrayH #define ARRAY_SIZE 5 typedef struct Array { void** data; int size; int count; } SArray; typedef bool (*FEqual)(void*, void*); typedef int (*FCompare)(void*, void*); void ArrayInit(SArray&); void ArrayDelete(SArray& arr); void ArrayDeleteIndex(SArray& arr, int n); void ArrayClear(SArray&); void ArrayAdd(SArray&, void* value); bool ArrayInsert(SArray& arr, void* value, int n); void* ArrayGet(SArray&, int n); int ArrayFindIndex(SArray&, int from, FEqual f, void* value); void ArraySort(SArray&, FCompare f); #endif
DynArray.cpp
#include <stdio.h> #include "DynArray.h" void ArrayInit(SArray& arr) { arr.data=new void*[ARRAY_SIZE]; arr.size=ARRAY_SIZE; arr.count=0; } void ArrayDelete(SArray& arr) { ArrayClear(arr); delete[] arr.data; arr.size=0; } void ArrayDeleteIndex(SArray& arr, int n) { if(n<0) return; if(n>=arr.count) return; delete arr.data[n]; for(int i=n;i<arr.count;++i) arr.data[i]=arr.data[i+1]; arr.count--; } bool ArrayInsert(SArray& arr, void* value, int n) { if(n<0) return false; void** tmp; int newsize; if(arr.size<=n) newsize=(n%ARRAY_SIZE+1)*ARRAY_SIZE; else if(arr.size<=arr.count) newsize=arr.size+ARRAY_SIZE; else newsize=arr.size; if(newsize!=arr.size){ tmp=new void*[newsize]; for(int i=0;i<n;++i) tmp[i]=arr.data[i]; } else tmp=arr.data; for(int i=arr.count;i>n;--i) tmp[i]=arr.data[i-1]; if(newsize!=arr.size){ delete[] arr.data; arr.data=tmp; arr.size=newsize; } arr.data[n]=value; arr.count++; return true; } void ArrayAdd(SArray& arr, void* value) { if(arr.size<=arr.count) ArrayInsert(arr,value,arr.count); else arr.data[arr.count++]=value; } void* ArrayGet(SArray& arr, int n) { if(n<0) return NULL; if(n>=arr.count) return NULL; void* ret=arr.data[n]; return ret; } void ArrayClear(SArray& arr) { int i=0; void* data; while(data=ArrayGet(arr,i++)) delete data; arr.count=0; } int ArrayFindIndex(SArray& arr, int from, FEqual f, void* value) { for(int i=from;i<arr.count;++i) if(f(arr.data[i], value)) return i; return -1; } void ArraySort(SArray& arr, FCompare f) { for (int i = 0; i < arr.count-1; ++i){ for (int j = arr.count-1; j > i; --j){ if (0<f(arr.data[j-1], arr.data[j])){ void* tmp = arr.data[j-1]; arr.data[j-1] = arr.data[j]; arr.data[j] = tmp; } } } }