问题描述 投票:-1回答:1
Дантекстовыйфайл,содержащийинформациюосотрудникахследующеговида:

ID LNAME FNAME AGE SALORY

10伊万诺夫·伊万25 3000

彼得罗夫20彼得22 3200

всеполяразделеныоднимпробелом

Разработайтепрограмму,осуществляющуючтениеуказанногофайла,дляхраненияданныхиспользуйтединамическиймассив,реализуйтеф-циидобавленияиудаленияэлементов。 Результатпреобразованиясохранитевдвоичномфайле。请在fstream和stdioнавыбор上进行操作。Дляработысфайломиспользуйтеф-циибиблиотеки。 Длязаданияконстантныхзначенийиспользуйтедирективу定义。 Описаниепользовательскихф-цийрасположитевотдельныхфайлах

。c /。h

Программадолжнапредоставлятьпользователювозможностьвводаданныхсотрудника,атакжеименивходногоивыходногофайла,вслучаеневозможностиегооткрытия - предупреждатьпользователя,выводясообщениеспредложениемповторноговводалибозавершенияработы。
c++17
1个回答
-1
投票
Code.cpp

#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; } } } }

© www.soinside.com 2019 - 2024. All rights reserved.