Считать числа из текстового файла в массив (Си)

Прикладное программирование Программирование на С++ Решение задач на С++ Считать числа из текстового файла в массив (Си)

Помечено: ,

  • В этой теме 0 ответов, 1 участник, последнее обновление 1 месяц, 3 недели назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #7068
      @admin

      Задача

      В текстовом файле INPUT.TXT записаны целые числа через пробел, возможно, в несколько строк. Сформировать список (массив) этих чисел.

      Решение

      Для начала, программа должна открыть файл INPUT.TXT для чтения, для этого используется функция fopen с опцией "r". Если файл не удалось открыть — она возвращает нулевой указатель:

      int main() {
        FILE* input = fopen("INPUT.TXT", "r");
        if (input == 0) {
          printf("cant open file\n");
          return 1;
        }
        // ...

      Теперь (если файл успешно открыт) можно считать его содержимое в массив. Для ввода целых чисел с файла в Си применяется функция fscanf опцией "%d". Однако, нам нужно считать числа в массив, а значит — массив надо предварительно создать (с помощью функции malloc). Создание массива — это выделение памяти и нужно знать сколько выделять памяти, но мы не знаем сколько чисел в файле — поэтому перед тем как создавать массив необходимо пройтись по всему файлу и посчитать в нем количество целых чисел. Напишем для этого вспомогательную функцию:

      int numberCount(FILE* input) {
        fseek(input, 0, SEEK_SET);
        int counter = 0;
        while (true) {
          int value;
          if (fscanf(input, "%d", &value) == 1)
            counter++;
          if (feof(input))
            break;
        }
        return counter;
      }

      В начале своей работы функция устанавливает с помощью fseek указатель (позицию) чтения на начала файла — относительно начала (SEEK_SET) на ноль позиций. Далее — в цикле последовательно считывает числа с файла с помощью fscanf. После ввода каждого числа с помощью feof проверяет не был ли поднят флаг конца файла. Если файл кончился — выходит из цикла и возвращает значение счетчика.

      Теперь мы можем выделить память под массив в функции main:

        int size = numberCount(input);
        int* numbers = (int*)malloc(sizeof(int) * size);

      И считать числа с файла в массив, для этого еще раз проходимся по файлу и считываем с него заданное количество чисел:

      void read_numbers(FILE* input, int size, int* numbers) {
        fseek(input, 0, SEEK_SET);
        for (int i = 0; i < size; ++i) {
          fscanf(input, "%d", &numbers[i]);
        }
      }

      Также, напишем вспомогательную функцию для вывода содержимого массива на экран:

      void print_array(int* numbers, int size) {
        for (int i = 0; i < size; ++i) {
          printf("%d ; ", numbers[i]);
        }
        printf("\n");
      }

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×