Бинарный файл содержит вещественные числа. Уменьшить в два раза все значения. - 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;
}
Объяснение кода листинга программы
Код выполняет следующие действия:
- Запрашивает имя файла и количество чисел для ввода.
- Считывает числа из файла и вычисляет их среднее значение.
- Создает временный файл и записывает в него исходные числа.
- Считывает числа из файла и сравнивает их со средним значением. Если число больше среднего, оно умножается на 2.
- Записывает полученные числа во временный файл.
- Удаляет исходный файл и переименовывает временный файл в исходное имя.
- Считывает данные из полученного файла и выводит их на экран. Коды операций:
-
include
- подключает библиотеку для работы с файлами и вывода данных на экран. -
include
- подключает библиотеку для работы с памятью. -
include
- подключает библиотеку для работы с клавиатурой и курсором. - gets(fname) - считывает строку из стандартного ввода (клавиатуры) в массив fname.
- scanf(
%d,&n) - считывает целое число из стандартного ввода в переменную n. - fopen(fname,
wb+) - открывает файл с именем fname для записи и чтения бинарных данных. - fread(&num, sizeof(double), 1, input) - считывает одно число из файла в переменную num.
- fwrite(&num, sizeof(double), 1, output) - записывает одно число из переменной num в файл output.
- fclose(input) - закрывает файл input.
- fclose(output) - закрывает файл output.
- remove(fname) - удаляет файл с именем fname.
- rename(
tmp.tmp,fname) - переименовывает файлtmp.tmpв имя fname. - fopen(fname,
rb) - открывает файл с именем fname для чтения бинарных данных. - printf() - выводит данные на экран.
- getchar() - считывает символ из стандартного ввода (клавиатуры).
- return EXIT_SUCCESS - завершает работу программы с успехом.