Методические указания ЛР10_примеры__2014 (1079950), страница 3
Текст из файла (страница 3)
Разработать функцию заполнения динамического массива структурных переменных наоснове двоичного файла с записями структурных переменных. Проверить ее работу.Массив распечатать специальной функцией (см. выше).//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ//////// РЕАЛИЗАЦИЯ ФУНКЦИИ/////////////////////////////// Выборка из файла в динамический массив// МУ п.12/////////////////////////////void StudFileToMas( const char * FileName , Student ** pMas , int * pRazm){long posF;int pFBin = _open( FileName, _S_IREAD |_O_BINARY );if ( pFBin == -1 ) { *pRazm = NULL; return;};posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию*pRazm = posF / sizeof(Student);*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 );};…//////// ПРОТОТИП// МУ п.12void StudFileToMas( const char * FileName , Student * pMas , int * pRazm);…//////// ГЛАВНАЯ ПРОГРАММА// МУ п.12////////Student * pStMas;int StudCount;// Файл в массивprintf ("Пункт МУ 12:\n");StudFileToMas( "BDStud.bin" , &pStMas , &StudCount );StudPrintMas( pStMas , StudCount);…Результат работы программы:Пункт МУ 12:Запись: Имя =Запись: Имя =Запись: Имя =Запись: Имя =ЗаписьЗаписьЗаписьЗапись№№№№-1234НомерНомерНомерНомер====5364СтипендияСтипендияСтипендияСтипендия====4647.972787.566024.059525.7413.
Разработать функцию заполнения двоичного файла на основе массива структурныхпеременных (описанных и проинициализированных выше). В функцию должныпередаваться: имя заполняемого файла, адрес исходного массива, размер массива.Изменить некоторые значения записей в массиве структур перед использованием.
Дляэтого в самом массиве, заполненном выше, сделать изменения (например, имя 2-й записи:имя и номер), используя фиксированное значение индекса элемента структурного12массива. Проверить работу этой функции. Заполнение файла проверить в файл менеджере(far или total commander), с помощью операции просмотра файла в шестнадцатеричномформате.//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ//////// РЕАЛИЗАЦИЯ ФУНКЦИИ//Перезапись массива структур в файл (Файл очищается!)// МУ п.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 );//};…//////// ПРОТОТИП// МУ п.13void StudMasToFile( const char * FileName , Student * pMas , int Razm);…////////// МУ п.13////////Student NZMas[] ={{"Запись 1" , 1 , 1000.0}, {"Запись 2" , 2 , 5000.0}, {"Запись 3" , 3 , 3000.0},{"Запись 4" , 4 , 4000.0}};RazmZ = sizeof(NZMas)/ sizeof(Student); // Вычисление размерности массива// Изменение второй (индекс = 1) записиNZMas[1].Num =5;strcpy( NZMas[1].Name , "Изменение 2-й");printf ("Пункт МУ 13:\n");StudMasToFile( "BDStud.bin" , NZMas , RazmZ );printf ("После редактирования массива и запоминания в файле\n");StudPrintMas( NZMas , StudCount);////////…Результат работы программы (распечатка):Пункт МУ 13:После редактирования массива и запоминания в файлеЗапись: Имя = Запись 1Номер = 1 СтипендияЗапись: Имя = Изменение 2-йНомер = 5 СтипендияЗапись: Имя = Запись 3Номер = 3 СтипендияЗапись: Имя = Запись 4Номер = 4 Стипендия====1000.005000.003000.004000.00Результат работы программы файла - BDStud.bin нужно посмотреть также в любом файлменеджере.14.
Разработать отдельную функцию распечатки файла с записями своих структурныхпеременных. Проверить работу этой функции.//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ13//////// РЕАЛИЗАЦИЯ ФУНКЦИИ// МУ п.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));if ( nByte == NULL) break;// вывод записиprintf( "%d - ", i + 1);PrintStudent(&SBuf);};// Закрытие файла_close( pFBin );};};…//////// ПРОТОТИП// МУ п.14void StudPrintFile( const char * FileName );…//////// ГЛАВНАЯ ПРОГРАММА// МУ п.14////////printf ("Пункт МУ 14:\n");printf ("После редактирования массива и запоминания - распечатка из файла функцией:\n");// Распечатка файла записейStudPrintFile( "BDStud.bin" );…Результат работы программы:Пункт МУ 13:1 - Запись: Имя2 - Запись: Имя3 - Запись: Имя4 - Запись: Имя====Нов.Нов.Нов.Нов.ЗаписьЗаписьЗаписьЗапись1234НомерНомерНомерНомер====2222СтипендияСтипендияСтипендияСтипендия====1000.002000.003000.004000.0015.
Разработать функцию определения числа записей в файле. Проверить ее работу насвоем файле.//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ//////// РЕАЛИЗАЦИЯ ФУНКЦИИ// Получить число записей в БД// МУ п.15int StudFileCount( const char * FileName , int * pRazm){long posF;int pFBin = _open( FileName, _S_IREAD |_O_BINARY );if ( pFBin == -1 ) { *pRazm = NULL; return NULL;};14posF = _lseek( pFBin, 0, SEEK_END ); // Установить новую текущую позицию*pRazm = posF / sizeof(Student);_close( pFBin );return *pRazm;};…//////// ПРОТОТИП// МУ п.15int StudFileCount( const char * FileName , int * pRazm);…//////// ГЛАВНАЯ ПРОГРАММА// Число записей в БД////////// МУ п.15////////printf ("Пункт МУ 15:\n");/////////////////////////////////////////////////////printf( "Число записей в БД = %d \n",StudFileCount( "BDStud.bin" , &StudCount ));…Результат работы программы:Пункт МУ 15:Число записей в БД = 416.
Разработать функцию очистки файла. Проверить ее работу совместно с функциейраспечатки файла записей – ничего не должно напечататься. Кроме этого проверитьразмер файла в файл-менеджере (Far, TotalComander и др.), этот размер должен бытьравен нулю.//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ//////// РЕАЛИЗАЦИЯ ФУНКЦИИ/////////////////////////// Очистка файла студентов// МУ п.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 );};…//////// ПРОТОТИП// МУ п.16void StudClearFile(const char * FileName);…//////// ГЛАВНАЯ ПРОГРАММА// МУ п.16////////StudPrintFile( "BDStud.bin" );printf ("Пункт МУ 16:\n");StudClearFile("BDStud.bin"); //Очистка файла БДStudPrintFile( "BDStud.bin" );…Печать до очистки:151234-Запись:Запись:Запись:Запись:ИмяИмяИмяИмя====ИвановПетровСидоровПечкинНомерНомерНомерНомер====3214СтипендияСтипендияСтипендияСтипендия====7000.002000.003000.004000.00Результат работы программы после очистки:Пункт МУ 16:Записей в файле нет!17.
Проверить использование функций удаления файла и снятия атрибута защиты файла,взяв ее из проекта примера. Заполним снова и распечатаем.//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ//////// РЕАЛИЗАЦИЯ ФУНКЦИИ//////////////////////////////////// Сброс флага файла// МУ п.17//////////////////////////////////void ClearReadonlyFile(const char * FileName){char Comand[40];// Снятие защиты с файла - отключение Readonlystrcpy (Comand , "attrib -R ");strcat (Comand , FileName);system( Comand );};//////////////////////////////////// МУ п.17//////////////////////////////////void StudRemoveFile(const char * FileName){char Comand[40];// Снятие защиты с файла - отключение Readonlystrcpy (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 );};…//////// ПРОТОТИП// МУ п.17void ClearReadonlyFile(const char * FileName);void StudRemoveFile(const char * FileName);…//////// ГЛАВНАЯ ПРОГРАММА///////// МУ п.17//////////printf ("Пункт МУ 17:\n");// StudRemoveFile("BDStud.bin"); // Временно за комментированоClearReadonlyFile("BDStud.bin");StudClearFile("BDStud.bin");StudPrintFile( "BDStud.bin" );////////1618.
Разработать функцию Swap двух структурных переменных (по адресу элемента)структурных переменных. Продемонстрировать и проверить работу этой функции наотдельных переменных и элементах массива.//////// ЗАГОЛОВОЧНЫЙ ФАЙЛ//////// РЕАЛИЗАЦИЯ ФУНКЦИИ/ МУ п.18//////////////////////////////////// обмен на основе копирования структурных переменных (возможен только без динамики!!)void SwapStudent ( Student * pA , Student * pB ){Student Temp;memcpy( &Temp , pA, sizeof(Student) );memcpy( pA , pB, sizeof(Student) );memcpy( pB , &Temp, sizeof(Student) );};…//////// ПРОТОТИП// МУ п.18void SwapStudent ( Student * pA , Student * pB );…//////// ГЛАВНАЯ ПРОГРАММА// МУ п.18////////printf ("Пункт МУ 17 снова добавим записи из массива:\n");StudMasToFile( "BDStud.bin" , pStMas , StudCount );StudPrintFile( "BDStud.bin" );printf ("Пункт МУ 18 (Sawp - до):\n");Student StudA ={ "Лаптева" , 1 , 1000.0};Student StudB ={ "Иванова" , 2 , 2000.0};PrintStudent(&StudA) ;PrintStudent(&StudB) ;printf ("Пункт МУ 18 (Sawp - после):\n");SwapStudent( &StudA , &StudB); // Обмен двух отдельныз записейPrintStudent(&StudA) ;PrintStudent(&StudB) ;// В массивеprintf ("Пункт МУ 18 (Sawp - pStMas - до):\n");StudPrintMas( pStMas , StudCount);printf ("Пункт МУ 18 (Sawp - pStMas - после):\n");SwapStudent( &pStMas[0] , &pStMas[2]); // Обмен двух элементов массиваStudPrintMas( pStMas , StudCount);…Результат работы программы:Пункт МУ 18Запись: ИмяЗапись: ИмяПункт МУ 18Запись: ИмяЗапись: ИмяПункт МУ 18Запись: ИмяЗапись: ИмяЗапись: ИмяЗапись: ИмяПункт МУ 18Запись: ИмяЗапись: ИмяЗапись: ИмяЗапись: Имя(Sawp - до):= ЛаптеваНомер == ИвановаНомер =(Sawp - после):= ИвановаНомер == ЛаптеваНомер =(Sawp - pStMas - до):= Запись № - 1Номер == НоваяНомер == Запись № - 3Номер == Запись № - 4Номер =(Sawp - pStMas - после):= Запись № - 3Номер == НоваяНомер == Запись № - 1Номер == Запись № - 4Номер =12Стипендия =Стипендия =1000.002000.0021Стипендия =Стипендия =2000.001000.007326СтипендияСтипендияСтипендияСтипендия====3889.899363.997457.207769.712376СтипендияСтипендияСтипендияСтипендия====7457.209363.993889.897769.7119.















