Методические указания ЛР10_примеры__2014 (1079950), страница 7
Текст из файла (страница 7)
Заголовочный файл проекта File_P3.hFile_P3.h– Заголовочный МОДУЛЬ//#include#include#include#include#include#include#include#include#include<fcntl.h><sys/types.h><sys/stat.h><io.h><stdio.h><conio.h><string.h><memory.h><malloc.h>//#include <errno.h>////using namespace std;//////////////////////////////////////////////// МУ п.2////////struct Student {public:char Name[20];int Num;double Oklad;};// Константы для управления функциямиenum TypeAddDel{ First = 1 , Last = 2 , Default = Last};// Прототипы/////////////////////////////////// МУ п.5// Распечатка отдельной структурной переменной студента////////void PrintStudent(Student * pS){printf( "Запись: Имя = %-15s Номер = %2d Стипендия = %8.2lf \n",pS->Name , pS->Num, pS->Oklad );};//////////////////////////// МУ п.8void StudPrintMas( Student * pMas , int Razm){for (int i = 0 ; i < Razm ; i++ ){PrintStudent(pMas + i); // Используется готовая функция};};/////////////////////////////// Выборка из файла в динамический массив// МУ п.12/////////////////////////////void StudFileToMas( const char * FileName , Student ** pMas , int * pRazm){long posF;42int pFBin = _open( FileName, _S_IREAD |_O_BINARY );if ( pFBin == -1 ) { *pRazm = NULL; return;};posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию*pRazm = posF / sizeof(Student);//*pMas = new Student[ *pRazm];*pMas = (Student *) calloc( *pRazm , sizeof(Student) );posF = _lseek( pFBin, 0, SEEK_SET ); // На начало// Буфер для чтенияStudent SBuf;for (int i = 0 ; i < *pRazm ; i++ ){int nByte = _read( pFBin , &SBuf , sizeof(Student));if ( nByte == NULL) break;memcpy( *pMas + i , &SBuf , sizeof(Student));};// Закрытие файла_close( pFBin );};/////////////////////////////////Перезапись массива структур в файл (Файл очищается!)// МУ п.13///////////////////////////void StudMasToFile( const char * FileName , Student * pMas , int Razm){char Comand[40];// Снятие защиты с файла - отключение Readonlystrcpy (Comand , "attrib -R ");strcat (Comand , FileName);system( Comand );int pFBin = _open( FileName , _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);if ( pFBin == -1 ) return;// цикл записиfor ( int i = 0 ; i < Razm ; i++ ){_write (pFBin , pMas + i , sizeof(Student));};_close( pFBin );//};///////////////////////// Печать файла БД Студентов// МУ п.14///////////////////////void StudPrintFile( const char * FileName ){long posF;int pFBin = _open( FileName, _S_IREAD |_O_BINARY );if ( pFBin != -1 ){posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позициюint Razm = posF / sizeof(Student);if ( Razm == 0 ) {_close( pFBin ); printf( "Записей в файле нет! \n") ; return;};posF = _lseek( pFBin, 0, SEEK_SET ); // На начало// Буфер для чтенияStudent SBuf;for (int i = 0 ; i < Razm ; i++ ){int nByte = _read( pFBin , &SBuf , sizeof(Student));43if ( nByte == NULL) break;// вывод записиprintf( "%d - ", i + 1);PrintStudent(&SBuf);};// Закрытие файла_close( pFBin );};};//////////////////////////////// Получить число записей в БД// МУ п.15int StudFileCount( const char * FileName , int * pRazm){long posF;int pFBin = _open( FileName, _S_IREAD |_O_BINARY );if ( pFBin == -1 ) { *pRazm = NULL; return NULL;};posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию*pRazm = posF / sizeof(Student);_close( pFBin );return *pRazm;};/////////////////////////// Очистка файла студентов// МУ п.16/////////////////////////void StudClearFile(const char * FileName){char Comand[40];// Временное снятие защиты с файла - отключение Readonlystrcpy (Comand , "attrib -R ");strcat (Comand , FileName);system( Comand );int pFBin = _open( FileName , _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);if ( pFBin == -1 ) return;_close( pFBin );};//////////////////////////////////// Сброс флага файла// МУ п.17//////////////////////////////////void ClearReadonlyFile(const char * FileName){char Comand[40];// Снятие защиты с файла - отключение Readonlystrcpy (Comand , "attrib -R ");strcat (Comand , FileName);system( Comand );};//////////////////////////////////// МУ п.18//////////////////////////////////// обмен на основе адресов структурных переменных (возможет только без динамики!!)void SwapStudent ( Student * pA , Student * pB ){Student Temp;/* можно и такTemp = *pA;*pA = *pB;*pB = Temp;44*/memcpy( &Temp , pA, sizeof(Student) );memcpy( pA , pB, sizeof(Student) );memcpy( pB , &Temp, sizeof(Student) );};//////////////////////////////////// МУ п.20//////////////////////////////////void StudSortMasNum( Student * pStMas , int StudCount ){for( int k =0 ; k< StudCount - 1 ; k++)for ( int i =0 ; i< StudCount - 1 ; i++ )if ( (pStMas + i)->Num > (pStMas + i + 1)->Num ) // ВозрастаниеSwapStudent( pStMas + i , pStMas + i + 1 );};//////////////////////////////////////////////////// Сортировка массива по окладу по убыванию// МУ п.21/////////////////////////////void StudSortOklad(const char * FileName ){// Чтение из файла в массивStudent * pStudMas;int Razm;StudFileToMas( FileName , &pStudMas , &Razm );// Сортировка массива по окладу по убываниюfor (int i = 0 ; i < Razm - 1 ; i++ )for (int k = 0 ; k < Razm - 1 ; k++ )// Сортировка разные режимы!!!!!!!!!!!!!!!!!!!!!!!!!!!if ( ((Student *)(pStudMas + k))->Oklad > ((Student *)(pStudMas + k +1))->Oklad ) //Убывание курс{ SwapStudent ( pStudMas + k , pStudMas + k+1 ); };//StudMasToFile( FileName , pStudMas , Razm );};//////////////////////////// МУ п.22//////////////////////////double StudSumm( const char * FileName , double * Sum){Student * pStudMas;int Razm;*Sum = 0.0;StudFileToMas( FileName , &pStudMas , &Razm );for ( int i = 0 ; i < Razm ; i++)*Sum+= (pStudMas + i)->Oklad;delete [] pStudMas;return *Sum;};///////////////////////////////////////// Сортировка по имени (дополнительные примеры) МУ п.21//////////////////////////////////////void StudSortName(const char * FileName ){// Чтение из файла в массивStudent * pStudMas;int Razm;StudFileToMas( FileName , &pStudMas , &Razm );///////////////////////////////45for (int i = 0 ; i < Razm - 1 ; i++ )for (int k = 0 ; k < Razm - 1 ; k++ )// Сортировка по имениif ( strcmp(((Student *)(pStudMas + k))->Name , ((Student *)(pStudMas + k +1))->Name) > 0 )// Убывание имя{ SwapStudent ( pStudMas + k , pStudMas + k+1 ); };//StudMasToFile( FileName , pStudMas , Razm );};//////////////////////////////////////// Сортировка по номеру (дополнительные примеры) МУ п.21//////////////////////////////////////void StudSortNum(const char * FileName ){// Чтение из файла в массивStudent * pStudMas;int Razm;StudFileToMas( FileName , &pStudMas , &Razm );StudSortMasNum( pStudMas , Razm ); // Использование сортировки в массиве!!!StudMasToFile( FileName , pStudMas , Razm );};///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Удаление из файла начало или конец файла///////////////////////////// МУ п.23.1/2///////////////////////////void StudAdd(const char * FileName , Student S , TypeAddDel TAD = Default ){//if ( TAD == Last){ClearReadonlyFile(FileName);int pFBin = _open( FileName, _O_RDWR |_O_BINARY | _O_APPEND);long posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию_write (pFBin , &S, sizeof(Student));// Закрытие файла_close( pFBin );return;};if( TAD == First ){Student * pStudMas;int Razm;StudFileToMas( FileName , &pStudMas , &Razm );Student * pTemp = (Student *) new Student [ Razm + 1];memcpy( pTemp , &S, sizeof(Student) );for ( int i = 1 ; i <=Razm ; i++)memcpy( pTemp + i , pStudMas + (i - 1), sizeof(Student) );//StudMasToFile( FileName , pTemp , Razm + 1 );delete [] pTemp;delete [] pStudMas;return;};return;};/////////////////////////////////////////////// Добавления по номеру в файл// МУ п.23.3///////////////////////void StudAddNum(const char * FileName , Student S , int Numb ){46Student * pStudMas;int Razm;if ( Numb < 0) return;// Формирование массиваStudFileToMas( FileName , &pStudMas , &Razm );if (Numb >= Razm ){StudAdd(FileName, S , Last );delete [] pStudMas;return;};//Student * pTemp = (Student *) new Student [ Razm + 1];for ( int i = 0 , k=0 ; i <= Razm ; i++, k++){if ( ( i - 1) == Numb){memcpy( pTemp + i , &S, sizeof(Student) );k--;}else{memcpy( pTemp + i , pStudMas + k, sizeof(Student) );};};// Запоминание в файл новогоStudMasToFile( FileName , pTemp , Razm + 1 );delete [] pTemp;delete [] pStudMas;};/////////////////////////////////////////////// Удаление первого или последнего из файла// МУ п.23.4/5/////////////////////////////////////////////void StudDel(const char * FileName , TypeAddDel TAD = Last ){Student * pStudMas;int Razm;if ( TAD == Last){StudFileToMas( FileName , &pStudMas , &Razm );StudMasToFile( FileName , pStudMas , Razm - 1 );delete [] pStudMas;return;};if ( TAD == First ){StudFileToMas( FileName , &pStudMas , &Razm );StudMasToFile( FileName , pStudMas + 1 , Razm - 1 );delete [] pStudMas;}};/////////////////////////////////////////////// Удаление по номеру из файла// МУ п.23.6///////////////////////////////////////////void StudDelNum(const char * FileName , int Numb ){Student * pStudMas;47int Razm;StudFileToMas( FileName , &pStudMas , &Razm );if ( Numb < 0 || Numb > Razm ) return;if ( Numb == 0) {StudDel( FileName , First );delete [] pStudMas;return;};if ( Numb == Razm -1) {StudDel( FileName , Last );delete [] pStudMas;return;};// Удаление из серединыStudent * pTemp = (Student *) new Student [ Razm - 1];for (int i =0, k =0 ; i < Razm ; i++ , k++){if ( i == Numb )k--;elsememcpy( pTemp + k , pStudMas + i, sizeof(Student) );};StudMasToFile( FileName , pTemp , Razm - 1 );delete [] pTemp;delete [] pStudMas;};//////////////////////////////////////////////////// Поиск и выборка одной записи по номеру// МУ п.23.7///////////////////////////////////////////void FindStudNum( const char * FileName , Student * pS , int Numb){Student * pStudMas;int Razm;StudFileToMas( FileName , &pStudMas , &Razm );if ( Numb < 0 || Numb >= Razm ){pS->Name[0] = '\0';pS->Num = NULL;pS->Oklad = NULL;}elsememcpy( pS , pStudMas + Numb , sizeof(Student) );delete [] pStudMas;};///////////////////////////////////////////// МУ п.23.8///////////////////////////////////////////void ChangeStudNum( const char * FileName , Student pS , int Numb){Student * pStudMas;int Razm;StudFileToMas( FileName , &pStudMas , &Razm );if ( Numb < 0 || Numb >= Razm ){delete [] pStudMas;return;}elsememcpy( pStudMas + Numb , &pS, sizeof(Student) );StudMasToFile( FileName , pStudMas , Razm );delete [] pStudMas;48};////////////////////////////////////////////////// Поиск по имени содержимого записей в файле в файле (первая запись)// МУ п.23.9///////////////////////////////////////////int FindStudName( const char * FileName , Student * pS , const char * FindName ){Student * pStudMas;int Razm;int i ;StudFileToMas( FileName , &pStudMas , &Razm );for ( i = 0 ; i < Razm ; i++)if ( strcmp ( (pStudMas + i)->Name , FindName ) == 0) break;if ( i == Razm ){// Не найденоpS->Name[0] = '\0';pS->Num = NULL;pS->Oklad = NULL;delete [] pStudMas;return -1 ;}// Найденоelsememcpy( pS , pStudMas + i , sizeof(Student) );delete [] pStudMas;return i ;};////////////////////////////////////////////////// Замена по номерам записей в файле///////////////////////////////////////////// МУ п.23.10///////////////////////////////////////////void SwapStudFile( const char * FileName , int NumA ,int NumB){Student * pStudMas;int Razm;int i ;StudFileToMas( FileName , &pStudMas , &Razm );if ( NumA < 0 || NumA >= Razm || NumB < 0 || NumB >= Razm ){}else{SwapStudent ( pStudMas + NumA , pStudMas + NumB );StudMasToFile( FileName , pStudMas , Razm );};//delete [] pStudMas;};//////////////////////////////////////////////////////// МУ п.17/23.11//////////////////////////////////void StudRemoveFile(const char * FileName){char Comand[40];// Снятие защиты с файла - отключение Readonlystrcpy (Comand , "attrib -R ");strcat (Comand , FileName);system( Comand );strcpy (Comand , "attrib -A ");strcat (Comand , FileName);49system( Comand );// Удаление файла все дискрипторы файла должны быть закрытыstrcpy (Comand , "del ");strcat (Comand , FileName);system( Comand );};11.3.















