непонятные знаки при чтении файла
Есть подобный вопрос на эту тему, но ответа для своего случая не нашел. Стоит задача: . Компоненты бинарного файла – вещественные числа. Нормировать компоненты файла вычитанием среднего арифметического всех чисел из каждого числа. Для создания исходного бинарного файла написать отдельную программу, в программе его обработки выводить на экран содержимое файла до и после изменения. Программа:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void output(FILE* file, int y);
void srarif(double mas[], double summa, double sred);
int main() {
srand(time(NULL));
double x, sr, sum=0, a[128];
int ch;
FILE* f = fopen("lab7_2.txt", "wb+");
if (!f) {
printf("Не удалось открыть файл");
exit(1);
}
for (int i = 0; i < 11; i++) {
x = rand() % 10;
a[i] = x;
fwrite(&x, sizeof(x), 1, f);
fprintf(f," - %lf ",x);
//fprintf(f, "%lf ", x);
//fprintf(f, "%c", space);
}
fclose(f);
output(f, ch);
printf("\n");
srarif(a, sum, sr);
f = fopen("lab7_2.txt", "wb");
if(!f){
printf("Не удалось открыть файл");
exit(1);
}
for (int i = 0; i < 11; i++) {
fwrite(&a[i], sizeof(a), 1, f);
fprintf(f, " - %lf ", a[i]);
//fprintf(f, "%lf ", x);
//fprintf(f, "%c", space);
}
fclose(f);
printf("\n");
output(f, ch);
return 0;
}
void output(FILE* file, int y) {
file = fopen("lab7_2.txt", "rb");
if (!file) {
printf("Не удалось открыть файл");
exit(1);
}
while (!feof(file) && !ferror(file))
{
y = getc(file);
if (y != EOF)
{
putchar(y);
}
}
fclose(file);
return 0;
}
void srarif(double mas[], double summa, double sred) {
for (int i = 0; i < 11; i++) {
summa += mas[i];
}
sred = summa / 11;
for (int i = 0; i < 11; i++) {
mas[i] -= sred;
}
}
Когда запускаю программу, в консоли появляется множество одинакового символа, который находится между тем, что по факту должно быть в файле(см.фото).

На всякий случай исходник без функций:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(time(NULL));
double x, sr, sum=0, a[128];
int ch;
FILE* f = fopen("lab7_2.txt", "wb+");
if (!f) {
printf("Не удалось открыть файл");
exit(1);
}
for (int i = 0; i < 11; i++) {
x = rand() % 10;
a[i] = x;
fwrite(&x, sizeof(x), 1, f);
fprintf(f," - %lf ",x);
//fprintf(f, "%lf ", x);
//fprintf(f, "%c", space);
}
fclose(f);
f = fopen("lab7_2.txt", "rb");
if (!f) {
printf("Не удалось открыть файл");
exit(1);
}
while (!feof(f) && !ferror(f))
{
ch = getc(f);
if (ch != EOF)
{
putchar(ch);
}
}
fclose(f);
printf("\n");
for (int i = 0; i < 11; i++) {
sum += a[i];
}
sr = sum / 11;
printf("%lf", sr);
for (int i = 0; i < 11; i++) {
a[i] -= sr;
}
f = fopen("lab7_2.txt", "wb");
if(!f){
printf("Не удалось открыть файл");
exit(1);
}
for (int i = 0; i < 11; i++) {
fwrite(&a[i], sizeof(a), 1, f);
fprintf(f, " - %lf ", a[i]);
//fprintf(f, "%lf ", x);
//fprintf(f, "%c", space);
}
fclose(f);
printf("\n");
f = fopen("lab7_2.txt", "rb");
if (!f) {
printf("Не удалось открыть файл");
exit(1);
}
while (!feof(f) && !ferror(f))
{
ch = getc(f);
if (ch != EOF)
{
putchar(ch);
}
}
fclose(f);
return 0;
}
Ответы (1 шт):
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
void create()
{
FILE * f = fopen("data.in","wb");
int count = rand()%20+10; // От 10 до 30 чисел
for(int i = 0; i < count; ++i)
{
double x = rand()*1000.0/RAND_MAX; // От 0 до 1000
fwrite(&x,sizeof(x),1,f);
}
fclose(f);
}
int main()
{
srand((unsigned int)time(0));
// Создание файла
create();
// Чтение файла, вывод, подсчет среднего
FILE* in = fopen("data.in","rb");
int count = 0;
double x, avg = 0;
while(fread(&x,sizeof(x),1,in)==1)
{
count++;
avg+= x;
printf("%lf ",x);
}
printf("\n\nAverage = %lf\n\n", avg /= count);
fseek(in,0,SEEK_SET);
FILE * out = fopen("data.out","wb");
while(fread(&x,sizeof(x),1,in)==1)
{
x -= avg;
printf("%lf ",x);
fwrite(&x,sizeof(x),1,out);
}
puts("\n\n");
fclose(in);
fclose(out);
}
Защиту от дурака (все проверки и т.п.) для краткости не писал.
Только не пытайтесь искать обычные десятичные числа, открывая создаваемые файлы в каком-нибудь "блокноте". Это бинарные файлы, как и требовалось. Их содержимое — числа в том виде, в котором они хранятся в памяти компьютера, что-то вроде
