Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный.

Решение задачи: «Компоненты бинарного файла - вещественные числа. Изменить знак у каждого третьего числа на противоположный»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define  BLOCKS               (10)
  5. #define  OFFSET_1             (0)
  6. #define  OFFSET_2             (sizeof(float))
  7. #define  OFFSET_3             (sizeof(float) * 2)
  8. #define  BLOCK_SIZE           (sizeof(float) * 3)
  9.  
  10. int main(int argc, char* argv[])
  11. {
  12.    char     pBlock[BLOCK_SIZE];
  13.  
  14.    FILE*    pData  = NULL;
  15.    float    fValue = 0.0f;
  16.  
  17.    srand(NULL);
  18.  
  19.    // Create
  20.    pData = fopen("test.bin","wb");
  21.  
  22.    if (!pData)
  23.    {
  24.       // Error !
  25.       return 0;
  26.    }
  27.  
  28.    for (int ii = 0; ii < BLOCKS * 3; ++ii)
  29.    {
  30.       fValue = (float)rand();
  31.       fwrite(&fValue,sizeof(float),1,pData);
  32.    }
  33.  
  34.    fclose(pData);
  35.    pData = NULL;
  36.  
  37.    // Before
  38.    pData = fopen("test.bin","rb");
  39.  
  40.    if (!pData)
  41.    {
  42.       // Error !
  43.       return 0;
  44.    }
  45.  
  46.    while (fread(pBlock,1,BLOCK_SIZE,pData) == BLOCK_SIZE)
  47.    {
  48.       printf("%f \t%f \t%f\n",*(float*)&pBlock[OFFSET_1],*(float*)&pBlock[OFFSET_2],*(float*)&pBlock[OFFSET_3]);
  49.    }
  50.  
  51.    fclose(pData);
  52.    pData = NULL;
  53.  
  54.    printf("\n\n");
  55.  
  56.    // Change  
  57.    pData = fopen("test.bin","r+b");
  58.  
  59.    if (!pData)
  60.    {
  61.       // Error !
  62.       return 0;
  63.    }
  64.  
  65.    for (int jj = 0; jj < BLOCKS; ++jj)
  66.    {
  67.       fseek(pData,BLOCK_SIZE * jj,SEEK_SET);
  68.  
  69.       if (fread(pBlock,1,BLOCK_SIZE,pData) == BLOCK_SIZE)
  70.       {
  71.          fseek(pData,BLOCK_SIZE * jj,SEEK_SET);
  72.  
  73.          *(unsigned int*)&pBlock[OFFSET_3] ^= 0x80000000;
  74.  
  75.          if (fwrite(pBlock,1,BLOCK_SIZE,pData) != BLOCK_SIZE)
  76.          {
  77.             // Error !
  78.             fclose(pData);
  79.             pData = NULL;
  80.             return 0;
  81.          }
  82.       }
  83.    }
  84.  
  85.    fclose(pData);
  86.    pData = NULL;
  87.  
  88.    // After
  89.    pData = fopen("test.bin","rb");
  90.  
  91.    if (!pData)
  92.    {
  93.       // Error !
  94.       return 0;
  95.    }
  96.  
  97.    while (fread(pBlock,1,BLOCK_SIZE,pData) == BLOCK_SIZE)
  98.    {
  99.       printf("%f \t%f \t%f\n",*(float*)&pBlock[OFFSET_1],*(float*)&pBlock[OFFSET_2],*(float*)&pBlock[OFFSET_3]);
  100.    }
  101.  
  102.    fclose(pData);
  103.    pData = NULL;
  104.  
  105.    return 0;
  106. }

Объяснение кода листинга программы

Код представляет собой программу на языке 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы