Бинарный файл содержит вещественные числа. Уменьшить в два раза все значения. - C (СИ)

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

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

Бинарный файл содержит вещественные числа. Уменьшить в два раза все значения большие среднего арифметического значения всего файла. Заменил printf/scanf на fwrite/fread и программа начала зацикливаться. Помогите
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(int argc, char *argv[])
{
    //Описание переменных
    char fname[16];
    int n=0,i=0;
    double avg=0,num=0;
    FILE *input,*output;
    //Запрашиваем имя файла и создаем его
    printf("Enter filename:\n");
    gets(fname);
    input=fopen(fname,"wb+");
    //Запрашиваем количество вводимых чисел
    printf("How much numbers?\n");
    scanf("%d",&n);
    //Запрашиваем числа для ввода и пишем в файл
    for (i=0;i<n;i++)
        {
            printf("Number %d:\n",i+1);
            scanf("%lf",&num);
            //fwrite(input,"%lf ",num);
            fwrite(&num, sizeof(double),1, input);
        }
    fclose(input);
    //Открываем файл для чтения
    input=fopen(fname,"rb");
    n=0; num=0;
    //Считываем числа и считаем среднее
    printf("Source file content:\n");
    while(!feof(input))
        {
            //fscanf(input,"%lf ",&num);
        fread(&num, sizeof(double), 1, input);  
        printf("%lf ",num);
            avg+=num;
            n++;
        }
    avg/=n;
    printf("\nAverage: %lf\n",avg);
    //Ставим курсор снова в начало файла
    rewind(input);
    //присоединение строки
    output=fopen("tmp.tmp","wb+");
    //Считываем числа из файла и сравниваем их с средним значением
    //Записываем результаты во временный файл
    while(!feof(input))
        {
            //fscanf(input,"%lf ",&num);
            fread(&num, sizeof(double), 1, input);
            if (num>avg) num*=2;
            //fprintf(output,"%lf ",num);
            fwrite(&num, sizeof(double), 1, output);
        }
    fclose(input);
    fclose(output);
    //удалить input,переименовать output
    remove(fname);
    rename("tmp.tmp",fname);
    input=fopen(fname,"rb");
    //Считать данные из полученного файла и вывести на экран
    printf("Result file content:\n");
    while(!feof(input))
        {
            fscanf(input,"%lf ",&num);
            printf("%lf ",num);
        }
    fclose(input);
 
getchar();
return EXIT_SUCCESS;
}

Решение задачи: «Бинарный файл содержит вещественные числа. Уменьшить в два раза все значения.»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(int argc, char *argv[])
{
        //Описание переменных
        char fname[16];
        int n=0,i=0;
        double avg=0,num=0;
        FILE *input,*output;
        //Запрашиваем имя файла и создаем его
        printf("Enter filename:\n");
        gets(fname);
        input=fopen(fname,"wb+");
        //Запрашиваем количество вводимых чисел
        printf("How much numbers?\n");
        scanf("%d",&n);
        //Запрашиваем числа для ввода и пишем в файл
        for (i=0;i<n;i++)
                {
                        printf("Number %d:\n",i+1);
                        scanf("%lf",&num);
                        //fwrite(input,"%lf ",num);
                        fwrite(&num, sizeof(double),1, input);
                }
        fclose(input);
        //Открываем файл для чтения
        input=fopen(fname,"rb");
        n=0; num=0;
        //Считываем числа и считаем среднее
        printf("Source file content:\n");
        while(!feof(input))
                {
                        //fscanf(input,"%lf ",&num);
                fread(&num, sizeof(double), 1, input);  
                printf("%lf ",num);
                        avg+=num;
                        n++;
                }
        avg/=n;
        printf("\nAverage: %lf\n",avg);
        //Ставим курсор снова в начало файла
        rewind(input);
        //присоединение строки
        output=fopen("tmp.tmp","wb+");
        //Считываем числа из файла и сравниваем их с средним значением
        //Записываем результаты во временный файл
        while(!feof(input))
                {
                    //fscanf(input,"%lf ",&num);
                        fread(&num, sizeof(double), 1, input);
                        if (num>avg) num*=2;
              //     fprintf(output,"%lf ",num);
                        fwrite(&num, sizeof(double), 1, output);
                }
        fclose(input);
        fclose(output);
        //удалить input,переименовать output
        remove(fname);
        rename("tmp.tmp",fname);
        input=fopen(fname,"rb");
        //Считать данные из полученного файла и вывести на экран
        printf("Result file content:\n");
        while(!feof(input))
                {
                        fread(&num, sizeof(double), 1, input);
                      printf("%lf ",num);
                }
        fclose(input);
 
getchar();
return EXIT_SUCCESS;
}

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

Код выполняет следующие действия:

  1. Запрашивает имя файла и количество чисел для ввода.
  2. Считывает числа из файла и вычисляет их среднее значение.
  3. Создает временный файл и записывает в него исходные числа.
  4. Считывает числа из файла и сравнивает их со средним значением. Если число больше среднего, оно умножается на 2.
  5. Записывает полученные числа во временный файл.
  6. Удаляет исходный файл и переименовывает временный файл в исходное имя.
  7. Считывает данные из полученного файла и выводит их на экран. Коды операций:
  8. include - подключает библиотеку для работы с файлами и вывода данных на экран.

  9. include - подключает библиотеку для работы с памятью.

  10. include - подключает библиотеку для работы с клавиатурой и курсором.

  11. gets(fname) - считывает строку из стандартного ввода (клавиатуры) в массив fname.
  12. scanf(%d,&n) - считывает целое число из стандартного ввода в переменную n.
  13. fopen(fname,wb+) - открывает файл с именем fname для записи и чтения бинарных данных.
  14. fread(&num, sizeof(double), 1, input) - считывает одно число из файла в переменную num.
  15. fwrite(&num, sizeof(double), 1, output) - записывает одно число из переменной num в файл output.
  16. fclose(input) - закрывает файл input.
  17. fclose(output) - закрывает файл output.
  18. remove(fname) - удаляет файл с именем fname.
  19. rename(tmp.tmp,fname) - переименовывает файл tmp.tmp в имя fname.
  20. fopen(fname,rb) - открывает файл с именем fname для чтения бинарных данных.
  21. printf() - выводит данные на экран.
  22. getchar() - считывает символ из стандартного ввода (клавиатуры).
  23. return EXIT_SUCCESS - завершает работу программы с успехом.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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