Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный - C (СИ)
Формулировка задачи:
Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный.
Решение задачи: «Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define BLOCKS (10)
#define OFFSET_1 (0)
#define OFFSET_2 (sizeof(float))
#define OFFSET_3 (sizeof(float) * 2)
#define BLOCK_SIZE (sizeof(float) * 3)
int main(int argc, char* argv[])
{
char pBlock[BLOCK_SIZE];
FILE* pData = NULL;
float fValue = 0.0f;
srand(NULL);
// Create
pData = fopen("test.bin","wb");
if (!pData)
{
// Error !
return 0;
}
for (int ii = 0; ii < BLOCKS * 3; ++ii)
{
fValue = (float)rand();
fwrite(&fValue,sizeof(float),1,pData);
}
fclose(pData);
pData = NULL;
// Before
pData = fopen("test.bin","rb");
if (!pData)
{
// Error !
return 0;
}
while (fread(pBlock,1,BLOCK_SIZE,pData) == BLOCK_SIZE)
{
printf("%f \t%f \t%f\n",*(float*)&pBlock[OFFSET_1],*(float*)&pBlock[OFFSET_2],*(float*)&pBlock[OFFSET_3]);
}
fclose(pData);
pData = NULL;
printf("\n\n");
// Change
pData = fopen("test.bin","r+b");
if (!pData)
{
// Error !
return 0;
}
for (int jj = 0; jj < BLOCKS; ++jj)
{
fseek(pData,BLOCK_SIZE * jj,SEEK_SET);
if (fread(pBlock,1,BLOCK_SIZE,pData) == BLOCK_SIZE)
{
fseek(pData,BLOCK_SIZE * jj,SEEK_SET);
*(unsigned int*)&pBlock[OFFSET_3] ^= 0x80000000;
if (fwrite(pBlock,1,BLOCK_SIZE,pData) != BLOCK_SIZE)
{
// Error !
fclose(pData);
pData = NULL;
return 0;
}
}
}
fclose(pData);
pData = NULL;
// After
pData = fopen("test.bin","rb");
if (!pData)
{
// Error !
return 0;
}
while (fread(pBlock,1,BLOCK_SIZE,pData) == BLOCK_SIZE)
{
printf("%f \t%f \t%f\n",*(float*)&pBlock[OFFSET_1],*(float*)&pBlock[OFFSET_2],*(float*)&pBlock[OFFSET_3]);
}
fclose(pData);
pData = NULL;
return 0;
}
Объяснение кода листинга программы
Код представляет собой программу на языке C, которая работает с бинарным файлом, содержащим массив вещественных чисел. Задачей программы является изменение знака каждого третьего числа в этом массиве. Программа начинается с определения некоторых констант и макросов:
#define BLOCKS (10)- определяет количество блоков в массиве#define OFFSET_1 (0)- определяет смещение первого числа в блоке#define OFFSET_2 (sizeof(float))- определяет смещение второго числа в блоке#define OFFSET_3 (sizeof(float) * 2)- определяет смещение третьего числа в блоке#define BLOCK_SIZE (sizeof(float) * 3)- определяет размер блока Затем следует функцияmain(), которая содержит основной код программы:- Создается буфер
pBlockразмеромBLOCK_SIZE. - Открывается файл
test.binдля записи (режимwb). Если файл не может быть открыт, программа завершается. - Записывается в файл массив вещественных чисел. Для этого используется цикл, который выполняется столько раз, сколько блоков в массиве. В каждой итерации цикла в буфер записывается случайное число типа
float, а затем оно записывается в файл. - Файл закрывается. Далее следует код, который проверяет корректность выполнения первой части программы:
- Открывается файл
test.binдля чтения (режимrb). Если файл не может быть открыт, программа завершается. - В цикле считывается каждый блок из файла в буфер и выводится на экран. Затем следует код, который изменяет знак каждого третьего числа в массиве:
- Открывается файл
test.binдля чтения и записи (режимr+b). Если файл не может быть открыт, программа завершается. - В цикле считывается каждый блок из файла в буфер.
- Если блок успешно прочитан, изменяется знак третьего числа в буфере, затем блок записывается обратно в файл. Далее следует код, который проверяет корректность выполнения второй части программы:
- Открывается файл
test.binдля чтения (режимrb). Если файл не может быть открыт, программа завершается. - В цикле считывается каждый блок из файла в буфер и выводится на экран.
В конце программы возвращается значение
0, что означает успешное выполнение программы.