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

  1. #define BLOCKS (10) - определяет количество блоков в массиве
  2. #define OFFSET_1 (0) - определяет смещение первого числа в блоке
  3. #define OFFSET_2 (sizeof(float)) - определяет смещение второго числа в блоке
  4. #define OFFSET_3 (sizeof(float) * 2) - определяет смещение третьего числа в блоке
  5. #define BLOCK_SIZE (sizeof(float) * 3) - определяет размер блока Затем следует функция main(), которая содержит основной код программы:
  6. Создается буфер pBlock размером BLOCK_SIZE.
  7. Открывается файл test.bin для записи (режим wb). Если файл не может быть открыт, программа завершается.
  8. Записывается в файл массив вещественных чисел. Для этого используется цикл, который выполняется столько раз, сколько блоков в массиве. В каждой итерации цикла в буфер записывается случайное число типа float, а затем оно записывается в файл.
  9. Файл закрывается. Далее следует код, который проверяет корректность выполнения первой части программы:
  10. Открывается файл test.bin для чтения (режим rb). Если файл не может быть открыт, программа завершается.
  11. В цикле считывается каждый блок из файла в буфер и выводится на экран. Затем следует код, который изменяет знак каждого третьего числа в массиве:
  12. Открывается файл test.bin для чтения и записи (режим r+b). Если файл не может быть открыт, программа завершается.
  13. В цикле считывается каждый блок из файла в буфер.
  14. Если блок успешно прочитан, изменяется знак третьего числа в буфере, затем блок записывается обратно в файл. Далее следует код, который проверяет корректность выполнения второй части программы:
  15. Открывается файл test.bin для чтения (режим rb). Если файл не может быть открыт, программа завершается.
  16. В цикле считывается каждый блок из файла в буфер и выводится на экран. В конце программы возвращается значение 0, что означает успешное выполнение программы.

Оцени полезность:

11   голосов , оценка 3.636 из 5
Похожие ответы