@ilyan112

Интересная задача (язык Си). Как работать с биарными файлами?

Решал интересные задания на сайте.
Задание:
Файл с именем BAZE.MMM хранит массивы, каждый из которых
состоит из 5 целых чисел.
Создайте программу, которая читает массивы из файла, выводит их и
рассчитать среднее арифметическое каждого массива.
Создать данные для чтения из файла и рассчитать средние
процедуры.
Проблема - выводит на экран 44 числа , вместо 45 и странным образом пихает их в массивы
Файл: https://yadi.sk/d/5MqM5rcVzd5sLw
Код до которого додумался:
#include <stdio.h>

void main() {
    FILE *input = NULL;
    int number;
    int m[9][5];
    int i = 0;
    int j = 0;
 
    input = fopen("baze.mmm", "rb");
	
    while(fread(&number, sizeof(int), 1, input)){
        printf("%d", number);
        m[i][j] = number;
		if (j==5){
		j++;
		}
		j++;
    }

    fclose(input);
    for(i = 0; i < 9; i++){
    	printf("\n");
    	for(j = 0; j < 5; j++){
    		printf(" m[%d][%d] = %d", i, j, m[i][j]);
		}
	}
    getch();
}
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Ваша задача не на потоковое чтение, а на бинарное. То есть она должна решаться другими способами.

Во-первых, нафиг fopen/fread/fclose - c бинарными файлами так не работают. С бинарными файлами работают через open/read/close. А если в файле фиксированная двоичная структура - обычно ее сначала описывают, потом считывают и накладывают структуру на область. Примеры дальше, случайно отправил.

Открыть, прочитать, закрыть
int i;
  short int handle;
  struct stat sb;

  char *wdir;
  if ((handle = open("/tmp/blabla.txt", O_RDONLY)) < NULL)
    {
      // Тут можно сделать обработку ошибок
      exit;
    }
   else
     stat("/tmp/blabla.txt", &sb);

  // Память под чтение одним вызовом + 1 байт на финальный нуль
  wdir = (char *) malloc(sb.st_size + 1);
 
  i = read(handle, wdir, sb.st_size);
  close(handle);

  *(wdir + sb.st_size) = '\0';
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
GavriKos
@GavriKos
if (j==5){
j++;
}
j++;
}


А i когда будем инкрементить? )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы