Методические указания ЛР10_2014 (1079947), страница 5
Текст из файла (страница 5)
///////////////////////////
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 )
{
Student * 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;
int 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--;
else
memcpy( 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;
}
else
memcpy( 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;
}
else
memcpy( pStudMas + Numb , &pS, sizeof(Student) );
StudMasToFile( FileName , pStudMas , Razm );
delete [] pStudMas;
};
////////////////////////////////////////////////
// Поиск по имени содержимого записей в файле в файле (первая запись)
// МУ п.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 ;
}
// Найдено
else
memcpy( 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];
// Снятие защиты с файла - отключение Readonly
strcpy (Comand , "attrib -R ");
strcat (Comand , FileName);
system( Comand );
strcpy (Comand , "attrib -A ");
strcat (Comand , FileName);
system( Comand );
// Удаление файла все дискрипторы файла должны быть закрыты
strcpy (Comand , "del ");
strcat (Comand , FileName);
system( Comand );
};
14 Результаты работы примера (текст)
Пункт МУ 4:
Stud2: Имя = Аксенова Номер = 2 Стипендия = 2000.00
Пункт МУ 5:
Запись: Имя = Лаптева Номер = 1 Стипендия = 1000.00
Запись: Имя = Аксенова Номер = 2 Стипендия = 2000.00
Пункт МУ 6:
Запись: Имя = Большаков Номер = 3 Стипендия = 3000.00
Пункт МУ 7:
Запись: Имя = Первый Номер = 1 Стипендия = 1000.00
Запись: Имя = Второй Номер = 2 Стипендия = 2000.00
Запись: Имя = Третий Номер = 3 Стипендия = 3000.00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000.00
Пункт МУ 8:
Запись: Имя = Первый Номер = 1 Стипендия = 1000.00
Запись: Имя = Второй Номер = 2 Стипендия = 2000.00
Запись: Имя = Третий Номер = 3 Стипендия = 3000.00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000.00
Пункт МУ 9:
Запись: Имя = Stud № - 12 Номер = 3 Стипендия = 3348.19
Запись: Имя = Stud № - 16 Номер = 7 Стипендия = 8209.78
Запись: Имя = Stud № - 20 Номер = 3 Стипендия = 7145.30
Запись: Имя = Stud № - 3 Номер = 1 Стипендия = 720.85
Запись: Имя = Stud № - 22 Номер = 3 Стипендия = 1234.78
Запись: Имя = Stud № - 15 Номер = 7 Стипендия = 9540.09
Пункт МУ 11(синий):
Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
Запись: Имя = Запись 2 Номер = 2 Стипендия = 2000.00
Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
Пункт МУ 11(Печать файла):
Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
Запись: Имя = Запись 2 Номер = 2 Стипендия = 2000.00
Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
Пункт МУ 11(Печать всего массива):
Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
Запись: Имя = Запись 2 Номер = 2 Стипендия = 2000.00
Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
Пункт МУ 11:
Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 3376.87
Запись: Имя = Запись № - 2 Номер = 6 Стипендия = 7522.20
Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 9526.05
Запись: Имя = Запись № - 4 Номер = 2 Стипендия = 7055.57
Пункт МУ 12:
Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 3376.87
Запись: Имя = Запись № - 2 Номер = 6 Стипендия = 7522.20
Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 9526.05
Запись: Имя = Запись № - 4 Номер = 2 Стипендия = 7055.57
Пункт МУ 13:
После редактирования массива и запоминания в файле
Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
Запись: Имя = Изменение 2-й Номер = 5 Стипендия = 5000.00
Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
Пункт МУ 14:
После редактирования массива и запоминания - распечатка из файла функцией:
1 - Запись: Имя = Запись 1 Номер = 1 Стипендия = 1000.00
2 - Запись: Имя = Изменение 2-й Номер = 5 Стипендия = 5000.00
3 - Запись: Имя = Запись 3 Номер = 3 Стипендия = 3000.00
4 - Запись: Имя = Запись 4 Номер = 4 Стипендия = 4000.00
Пункт МУ 15:
Число записей в БД = 4
Пункт МУ 13:
1 - Запись: Имя = Иванов Номер = 3 Стипендия = 7000.00
2 - Запись: Имя = Петров Номер = 2 Стипендия = 2000.00
3 - Запись: Имя = Сидоров Номер = 1 Стипендия = 3000.00
4 - Запись: Имя = Печкин Номер = 4 Стипендия = 4000.00
Пункт МУ 16:
Записей в файле нет!
Пункт МУ 17:
Записей в файле нет!
Пункт МУ 17 снова добавим записи из массива:
1 - Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 3376.87
2 - Запись: Имя = Новая Номер = 6 Стипендия = 7522.20
3 - Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 9526.05
4 - Запись: Имя = Запись № - 4 Номер = 2 Стипендия = 7055.57
Пункт МУ 18 (Sawp - до):
Запись: Имя = Лаптева Номер = 1 Стипендия = 1000.00
Запись: Имя = Иванова Номер = 2 Стипендия = 2000.00
Пункт МУ 18 (Sawp - после):
Запись: Имя = Иванова Номер = 2 Стипендия = 2000.00
Запись: Имя = Лаптева Номер = 1 Стипендия = 1000.00
Пункт МУ 18 (Sawp - pStMas - до):
Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 3376.87
Запись: Имя = Новая Номер = 6 Стипендия = 7522.20
Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 9526.05
Запись: Имя = Запись № - 4 Номер = 2 Стипендия = 7055.57
Пункт МУ 18 (Sawp - pStMas - после):
Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 9526.05
Запись: Имя = Новая Номер = 6 Стипендия = 7522.20
Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 3376.87
Запись: Имя = Запись № - 4 Номер = 2 Стипендия = 7055.57
Пункт МУ 19 (SORT - pStMas - до):
Запись: Имя = Запись № - 3 Номер = 2 Стипендия = 9526.05
Запись: Имя = Новая Номер = 6 Стипендия = 7522.20
Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 3376.87
Запись: Имя = Запись № - 4 Номер = 2 Стипендия = 7055.57
Пункт МУ 19 (SORT - pStMas - после Oklad):
Запись: Имя = Запись № - 1 Номер = 0 Стипендия = 3376.87














