МУ_ЛР7_ОП (1079938), страница 7
Текст из файла (страница 7)
// Структура для демонстрации
struct Student {
char Name[20];
int Num;
float Oklad;
};
…
// Для начального создния файла
//pFBin = _open( "BDStud.bin", _S_IREAD | _S_IWRITE |_O_BINARY ); // _S_IWRITE
//_close( pFBin );
system("attrib -R BDStud.bin ");
pFBin = _open( "BDStud.bin", _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);
Student SMas[] ={{"Первый" , 1 , 1000.0}, {"Второй" , 2 , 2000.0}, {"Третий" , 3 , 3000.0}, {"Четвертый" , 4 , 4000.0}};
RazmS = sizeof(SMas)/ sizeof(Student);
int err = errno; // код ошибки
if ( pFBin != -1 )
{
for ( int i = 0 ; i < RazmS ; i++ )
{
_write (pFBin , &(SMas[i]) , sizeof(Student));
};
_close( pFBin );
};
67 Запись из файла в массив - _read).
В данном разделе приведем два варианта записи массива структур в файл: низкоуровневый и на основе потоков. Используем структуру Student:
// Структура для демонстрации
struct Student {
char Name[20];
int Num;
float Oklad;
};
// Запись файла из отсортированного массива
system("attrib -R BDStud.bin ");
pFBin = _open( "BDStud.bin", _O_RDWR |_O_BINARY | _O_CREAT | _O_TRUNC);
for ( int i = 0 ; i < RazmS ; i++ )
{
_write (pFBin , pStudMas + i , sizeof(Student));
};
_close( pFBin );
68 Распечатка файла структур.
Низкоуровневая распечатка файла, функции смотрите в примерах выше.
// Печать файла для структуры Student
// Выделение памяти под массив
pStudMas = (Student * ) calloc(RazmS , sizeof(Student));
// Чтение из файла в массив
system("attrib -R BDStud.bin "); // снимем защиту от записи
pFBin = _open( "BDStud.bin", _S_IREAD |_O_BINARY );
printf ("Текущее содержимое файла:\n");
// int nByte;
for (int i = 0 ; i < RazmS ; i++ )
{
int nByte = _read( pFBin , &SBuf , sizeof(Student));
if ( nByte == NULL) break;
memcpy( pStudMas + i , &SBuf , sizeof(Student)); // в массив
PrintStudent(&SBuf) ;
};
_close( pFBin );
//
StudPrintMas( pStudMas , RazmS);
Результат работы фрагмента текста.
Запись: Имя = Первый Номер = 1 Стипендия = 1000,00
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
Запись: Имя = Третий Номер = 3 Стипендия = 3000,00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000,00
69 Поиск и чтение записи по номеру.
Низкоуровневое чтение, контролируется номер для поиска (nFind).
system("attrib -R BDStud.bin ");
pFBin = _open( "BDStud.bin", _S_IREAD |_O_BINARY );
int nFind = 2;
posF = _lseek( pFBin, (nFind - 1)* sizeof(Student), SEEK_SET );
int nByte = _read( pFBin , &SBuf , sizeof(Student));
if ( nByte != NULL) {
printf( "Номер- %d\n" , nFind );
PrintStudent(&SBuf); } // Печать структуры
else
printf( "Ошибка номера - %d !\n" , nFind ); // Ошибка номера
_close( pFBin );
Результат работы фрагмента текста:
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
70 Удаление записи по номеру.
Низкоуровневое удаление, контролируется номер для поиска и ичпорльзуем функции: StudPrintFile, StudFileToMas и StudMasToFile. Для удаления: считываем в массив, удаляем (номер удаляемой записи считается с 1-цы - NumDel), а затем записываем в файл.
printf( "ДО УДАЛЕНИЯ (по номеру)!\n" ); //
StudPrintFile( "BDStud.bin");
Student * pMas;
int RazmF;
int NumDel = 2;
StudFileToMas( "BDStud.bin" , &pMas , &RazmF);
///
for ( int i = 0, k = 0 ; i < RazmF ; i++)
{
if ( (NumDel - 1) != i )
{ memcpy( pMas + k , pMas + i , sizeof(Student)); k++;}
};
///
StudMasToFile( "BDStud.bin" , pMas , ( RazmF > NumDel ) ? RazmF - 1 : RazmF );
printf( "ПОСЛЕ УДАЛЕНИЯ (по номеру)!\n" ); //
StudPrintFile( "BDStud.bin");
Результат работы фрагмента текста (NumDel = 2):
ДО УДАЛЕНИЯ (по номеру)!
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
Запись: Имя = Первый Номер = 1 Стипендия = 1000,00
Запись: Имя = Третий Номер = 3 Стипендия = 3000,00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000,00
ПОСЛЕ УДАЛЕНИЯ (по номеру)!
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
Запись: Имя = Третий Номер = 3 Стипендия = 3000,00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000,00
71 Добавление записи по номеру.
Низкоуровневое удаление, контролируется номер для поиска и ичпорльзуем функции: StudPrintFile, StudFileToMas и StudMasToFile. Для удаления: считываем в массив, удаляем (номер удаляемой записи считается с 1-цы - NumDel), а затем записываем в файл. Для удаления: считываем в массив, добавляем (номер добавляемой записи считается с 1-цы - NumAdd), а затем перезаписываем в файл.
//Добавление записи по номеру
printf( "ДО ДОБАВЛЕНИЯ (по номеру)!\n" ); //
StudPrintFile( "BDStud.bin");
int NumAdd = 2;
Student SAdd = {"ADDED" , 33 , 15.00};
StudFileToMas( "BDStud.bin" , &pMas , &RazmF);
Student * pMasNew;
pMasNew = ( Student * ) calloc( RazmF + 1 , sizeof(Student));
int p = 0;
int m =0 ;
for ( m = 0 ; m < RazmF ; m++ , p++)
{
if ( (NumAdd - 1) != p )
{ memcpy( pMasNew + p , pMas + m , sizeof(Student)); }
else
{ memcpy( pMasNew + p , &SAdd , sizeof(Student)); m--;}
};
if ( p == m )
memcpy( pMasNew + p , &SAdd , sizeof(Student));
StudMasToFile( "BDStud.bin" , pMasNew , RazmF + 1 );
free ( pMasNew );
printf( "ПОСЛЕ ДОБАВЛЕНИЯ (по номеру)!\n" ); //
StudPrintFile( "BDStud.bin");
Результат работы фрагмента текста (NumAdd= 2):
ДО ДОБАВЛЕНИЯ (по номеру)!
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
Запись: Имя = Третий Номер = 3 Стипендия = 3000,00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000,00
ПОСЛЕ ДОБАВЛЕНИЯ (по номеру)!
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
Запись: Имя = ADDED Номер = 33 Стипендия = 15,00
Запись: Имя = Третий Номер = 3 Стипендия = 3000,00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000,00
72 Модификация записи в двоичном файле.
Фрагмент программы для модификации одной записи в существующем двоичном файле структур. Операция выполняется через прямое чтение записи по номеру, ее изменения и запись на тоже место модифицированной записи. Нумерация записей при удалении начинаетчи с единицы. В этом случае используются операции низкоуровневого ввода и вывода.
…
// ИЗМЕНЕНИЕ ЗАПИСИ
Student SBuf;
printf( "ДО ИЗМЕНЕНИЯ (по номеру = %d)!\n" , nChange ); //
// Чтение по позиции
long pos1 =3 , pos2; // Читаем запись
pFBin = _open( "write.bin", _O_RDWR |_O_BINARY | _O_APPEND );
pos2 = _lseek( pFBin, sizeof(Student)* (pos1 - 1), SEEK_SET );
_read( pFBin , &SBuf , sizeof(Student));
_close( pFBin );
// Изменение записи
pFBin = _open( "write.bin", _O_RDWR |_O_BINARY ); // Нет _O_APPEND
pos2 = _lseek( pFBin, sizeof(Student)* (pos1 - 1), SEEK_SET );
_read( pFBin , &SBuf , sizeof(Student));
pos2 = _lseek( pFBin, sizeof(Student)* (pos1 - 1), SEEK_SET );
strcpy(SBuf.Name, "Изменение");
_write (pFBin , &SBuf , sizeof(Student));
_commit ( pFBin ); // Запись на диск после изменений
_close( pFBin );
printf( "ПОСЛЕ ИЗМЕНЕНИЯ (по номеру = %d)!\n" , nChange ); //
StudPrintFileWR( "BDStud.bin");
…
Результат работы фрагмента текста (nChange = 3):
ДО ИЗМЕНЕНИЯ (по номеру = 3)!
ДО ИЗМЕНЕНИЯ (по номеру = 3)!
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
Запись: Имя = Первый Номер = 1 Стипендия = 1000,00
Запись: Имя = Третий Номер = 3 Стипендия = 3000,00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000,00
ПОСЛЕ ИЗМЕНЕНИЯ (по номеру = 3)!
Запись: Имя = Второй Номер = 2 Стипендия = 2000,00
Запись: Имя = Первый Номер = 1 Стипендия = 1000,00
Запись: Имя = Изменение! Номер = 3 Стипендия = 3000,00
Запись: Имя = Четвертый Номер = 4 Стипендия = 4000,00















