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