Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный - 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
, что означает успешное выполнение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д