Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2020, 02:00   #1
Artemii21
Пользователь
 
Регистрация: 04.04.2020
Сообщений: 26
Вопрос запись в двоичные файлы

Здравствуйте! Мне необходимо записать элементы массива (целые числа) в один бинарный файл, затем считать оттуда эти элементы, некоторые изменить и результат (вещественные числа) записать в другой бинарный файл, но вот что-то во второй файл записывается какой-то бред, или не бред. Может кто-то объяснить, правильно ли числа представлены, или все-такие есть где-то ошибка? Осуществил вывод результата не только в файл, но и на экран, ответ верный на экране.

Код:
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>

int main()
{
	int n, i, a[10];
	float b[10];
	FILE* f, * f2;
	f = fopen("prob1.dat", "rb+");
	printf("Enter n=");
	scanf("%i", &n);
	fwrite(&n, sizeof(int), 1, f);
	for (i = 0; i < n; i++)
	{
		printf("\a(%i)= ", i);
		scanf("%i", &a[i]);
	}
	for (i = 0; i < n; i++)
	{
		printf("%3i", a[i]);
		fwrite(&a[i], sizeof(int), 1, f);
	}
	fclose(f);
	f = fopen("prob1.dat", "rb");
	f2 = fopen("prob2.dat", "wb+");
	for (int i = 0; i < n; i++)
	{
		fread(&a[i], sizeof(int), 1, f);
	}
	for (int i = 0; i < n; i++)
	{
		b[i] = a[i];
		if (a[i] > 0)
		{
			if (a[i] % 4 == 0)
			{
				b[i] = 0.1;
			}
		}
	}
	for (int j = 0; j < n; j++)
	{
		fwrite(&b[j], sizeof(double), 1, f2);
	}
	printf("\n");
	for (int j = 0; j < n; j++)
	{
		printf("%4.1f ", b[j]);
	}
	fclose(f);
	printf("\n");
	system("pause");
	return 0;
}
Изображения
Тип файла: jpg okouh.JPG (21.1 Кб, 16 просмотров)

Последний раз редактировалось Artemii21; 10.05.2020 в 02:21.
Artemii21 вне форума Ответить с цитированием
Старый 10.05.2020, 02:54   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

1) Файл prob1.dat сначала открывается на чтение, а потом в него идут попытки записи.
2) Сначала в файл записывается значение n, а потом сам массив. Считывать нужно в том же порядке.
3) Элементы массива b типа float, а размер берется double.
4) Зачем записывать массивы поэлементно, если можно целиком.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.05.2020 в 02:59.
BDA вне форума Ответить с цитированием
Старый 10.05.2020, 03:12   #3
Artemii21
Пользователь
 
Регистрация: 04.04.2020
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
1) Файл prob1.dat сначала открывается на чтение, а потом в него идут попытки записи.
2) Сначала в файл записывается значение n, а потом сам массив. Считывать нужно в том же порядке.
3) Элементы массива b типа float, а размер берется double.
Я вроде бы исправил, открыл hex редактор, но там почему-то значение последнего элемента массива перескакивает в его начало. На фото правильный ответ 1.0 2.0 3.0 0.1, а вот в файл записалось 0.1 1.0 2.0 3.0, почему?
Код:
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>

int main() {
  int n, i, a[10];
  float b[10];
  FILE * f, * f2;
  f = fopen("probb1.dat", "rb+");
  do {
    printf("Enter n=");
    scanf("%i", & n);
  } while (n > 10);
  fwrite( & n, sizeof(int), 1, f);
  for (i = 0; i < n; i++) {
    printf("\a(%i)= ", i);
    scanf("%i", & a[i]);
  }
  for (i = 0; i < n; i++) {
    printf("%3i", a[i]);
    fwrite( & a[i], sizeof(int), 1, f);
  }
  fclose(f);
  f = fopen("probb1.dat", "rb+");
  f2 = fopen("probb2.dat", "wb+");
  fread( & n, sizeof(int), 1, f);
  for (int i = 0; i < n; i++) {
    fread( & a[i], sizeof(int), 1, f);
  }
  for (int i = 0; i < n; i++) {
    b[i] = a[i];
    if (a[i] > 0) {
      if (a[i] % 4 == 0) {
        b[i] = 0.1;
      }
    }
  }
  fwrite( & n, sizeof(int), 1, f2);
  for (int j = 0; j < n; j++) {
    fwrite( & b[j], sizeof(float), 1, f2);
  }
  printf("\n");
  for (int j = 0; j < n; j++) {
    printf("%4.1f", b[j]);
  }
  fclose(f);
  printf("\n");
  system("pause");
  return 0;
}
Изображения
Тип файла: jpg xd.JPG (14.9 Кб, 15 просмотров)

Последний раз редактировалось Artemii21; 10.05.2020 в 12:23.
Artemii21 вне форума Ответить с цитированием
Старый 10.05.2020, 03:24   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

1) Код не от обсуждаемой программы, кажется.
2) Не нужно брать адреса от vzlet, posadka и других символьных массивов при считывании. А при печати ни от каких переменных не нужно брать адрес.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.05.2020, 10:58   #5
Artemii21
Пользователь
 
Регистрация: 04.04.2020
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
1) Код не от обсуждаемой программы, кажется.
2) Не нужно брать адреса от vzlet, posadka и других символьных массивов при считывании. А при печати ни от каких переменных не нужно брать адрес.
извиняюсь, позднее время было, исправил код и описание ошибки

Последний раз редактировалось Artemii21; 10.05.2020 в 12:23.
Artemii21 вне форума Ответить с цитированием
Старый 10.05.2020, 18:10   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

1) Я забыл, что плюсик позволяет и читать, и писать, но все же лучше открыть файл probb1.dat сначала с флагами wb+, чтобы он создался, если его нет.
2) У меня ничего не перескочило. Сначала записалось значение n, затем элементы массива.
3) Файл f2 тоже стоит закрыть в конце.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 10.05.2020 в 18:13.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двоичные файлы stas45rus Помощь студентам 0 06.10.2011 17:38
Двоичные файлы Angel_Ada Помощь студентам 0 22.04.2011 01:01
Двоичные файлы Xensis Помощь студентам 2 30.07.2010 17:12
Двоичные файлы на С++ mr Vi Помощь студентам 6 17.01.2010 13:11