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