Как считать данные из файла в массив c

Обновлено: 03.07.2024

и сохранить каждое значение в массиве. Есть еще кое-что для этой конкретной проблемы (другие функции пока закомментированы), но это то, что действительно доставляет мне неприятности. Я часами смотрел на предыдущий вопрос о данных и массивах, но не могу найти, где я делаю ошибку.

и вот мой вывод:

Спасибо за ваше время.

Решение

Проблема в том, что вы объявляете местный grades массив размером 1, скрывающий глобальный grades массив. Мало того, вы теперь получаете доступ к массиву за пределами, так как локальный grades массив может содержать только 1 элемент.

Так что избавьтесь от строки:

Тем не менее, следует отметить, что это:

недопустимый синтаксис C ++. Вы просто наткнулись на это по ошибке, но этот код не скомпилируется, если скомпилирован с использованием строгого компилятора ANSI C ++.

Массив в C ++ должен быть объявлен с использованием константного выражения для обозначения количества записей в массиве, а не переменной. Вы, случайно, используете нестандартное расширение компилятора под названием Массивы переменной длины или VLA для краткости.

Если это для школьного задания, не объявляйте массивы таким способом (даже если вы хотели это сделать), так как это официально не C ++. Если вы хотите объявить динамический массив, это то, что std::vector для.

Другие решения

Я не вижу проблем с чтением файла, вы только что перепутали глобальную переменную с локальной переменной

Тебе это не нужно

Внутри функции readData

Выход

Ваш оригинальный глобальный массив grades размером 22, заменяется локальным массивом с тем же именем, но размером 0.
(Он не перезаписывается, просто любой код, использующий переменную grades внутри объема, который был определен второй, будет читать значение второго grades массив, так как он имеет более высокий приоритет.)

И то и другое inFile >> grades[i]; а также cout << grades[i] << " "; должен возвращать ошибки времени выполнения, когда вы читаете за пределами их размера (похоже, вы не используете строгий компилятор).
[ int grades[i]; обычно возвращает ошибку времени компиляции, поскольку вы не должны / обычно не можете инициализировать фиксированный массив переменной]

Я думаю, что вместо сбоя вашей программы происходит то, что grades[i] просто возвращает анонимный экземпляр переменной со значением 0, отсюда и ваш вывод.

Приветствую все сообщество программистов!
Требуется A)считать числа из файла в массив, Б)а затем удалить в заданном массиве действительных чисел «лишние» (кроме первого) элементы так, чтобы оставшиеся образовывали возрастающую последовательность.
С пунктом Б) проблем нет никаких, но вот с считыванием никак не получается. Выводит пустую строку.
В чем может быть проблема?

Вот собсвтенно исходный код:

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Считывание чисел из файла в массив
Делая расчетку, запнулся на считывании данных :cry: Имеется файл вида n m 2 3 2 5 1 5 .

Считывание чисел с файла в массив
Всем привет. Не могу разобраться, как правильно мне считать N числа с моего файла file.txt и.


Считывание из файла чисел и преобразование их в массив
Здравствуйте, нужно преобразовать числа из файла в исходный массив(в данном случаи Array), с.

Путь точно правильный. Про new и delete знаю, но как и с чем их едят пока не разобрался.
Нужен одномерный динамический массив, верно? Да. Ну либо используй обычный с запасом по длине: 100, 1000.

Для будущих студентов, кто загуглит подобный вопрос:

Программа:
-считывает сколько угодно чисел из файла в массив.
-два варианта сортировки +/-(метод пузырька)
-пользовательский интерфейс.

Считывание из файла в динамический массив дробных чисел
Всем добрый день! проблема есть файл txt в не лежат дробные числа таким образом: 122.55, 555.22.

Считывание чисел из файла в массив, без пробелов
Добрый день. Нужно реализовать считывание чисел из файла, выбираемого в OpenDialog'е, в массив.


Считывание таблицы чисел из файла в двумерный массив
Написать программу, считывающую таблицу чисел из файла в двумерный массив.

Считывание из файла чисел, разделенных пробелом, в массив
В текстовом файле массив целых чисел записанных через пробел. Затем переход на новую строку и еще.

Считывание из файла массив целых чисел и действия над ним
помогите написать программу. Из файла (имя файла вводится с клавиатуры) считывается массив целых.

По ходу дела, я очень плохо понял тему указателей и работы с памятью, и теперь вот никак не могу сделать, казалось бы простейшую вещь.
Есть текстовый файл со словами, записанными по одному слову в строчку. Нужно считать каждую строку в массив arr[]. Пробовал и fscanf и fgetsе - не получается :(
Подскажите, что я не так делаю, и как правильно?

На сколько я понял вы пытаетесь прочитать строку из файла и сохранить ее как элемент массива arr.
Но делаете это не правильно.
Ваша ошибка в том, что fscanf/fgets не выделяет память для хранения строки, она использует тот буфер, который вы ей предоставите. Но вы ничего не предоставляете.
Вам нужно для каждого элемента arr выделить память под строку:
arr[i] = (char*)malloc(sizeof(char) * BUFLEN);
где BUFLEN - некоторая целочисленная константа, обозначающая максимальную длину строки.
Тогда чтение из файла, как реализовано у вас пройдет.
В конце память выделенную с помощью malloc нужно освободить с помощью вызова free для каждого элемента массива arr.
И не забывайте обрабатывать ошибки выделения памяти и возвраты файловых операций.
fscanf со спецификатором формата "%s" считывает не строку, а слово - в строке может быть много слов. Для чтения строки используйте fgets, либо читайте посимвольно fgetc.
Когда заработает, потренируйтесь на файле, содержащем строку из более чем BUFLEN символов и попытайтесь найти корректный выход из этой ситуации.

Спасибо за ответ!
Функция fscanf мне вполне подходит, т.к. в моих исходных данных все строки состоят из одного слова. С выделением памяти, я кажется разобрался. В цикле, перед тем как использовать fscanf я выделяю память для элемента массива.

Но с высвобождением - не уверен что делаю верно. Правильно ли высвобождается память в этом цикле?

В итоге программа работает, но не совсем корректно. Я вывожу на экран не пустые ячейки массива с помощью цикла:


И получаю результат:

Откуда берутся лишние три строки, и ошибка сегментации?

romajke, Проверка
if (arr[i])
в вашем случае не срабатывает.
Потому что, чтоб в arr[i] были нули (т.е. условие ложно) их нужно туда присвоить, а у вас этого нет.
Перед чтением из файла, присвойте всем значениям arr нули.
Потом, когда будете выделять память для строк значащие элементы примут значения !=0, а пустые строки так и останутся нулями и условие отработает как надо.

Все верно, это помогло. Спасибо!
Код работает корректно.
А что с памятью? Верно ли я ее высвобождаю циклом

Или нужно как то по другому?

romajke, Раз уж вы выделяете память не для всех элементов массива, то и освобождать нужно только их: добавьте перед free условие:
if(arr[i])

res2001, да. Это понятно, теперь код полностью корректно работает. Но не совсем понятна работа fscanf в данном контексте. Если я, например, не сразу считываю в элемент массива arr[], а предварительно записываю данные в созданную переменную типа char word[SIZE]:


то код уже работает не корректно.
Все элементы массива заполняются последней считанной строкой:

Если я правильно понимаю, то элементы массива получают ссылку на word, и получают значение которое хранится по адресу переменной word. Но как это изменить - не пойму. Как передать в элемент массива именно значение word?

Чтение из файла

Добрый день! В этой статье я расскажу о том, как написать программу, которая будет считывать строки из файла. Покажу как записать их в массив или вывести. При написании программы будут использоваться функции из стандартной библиотеки языка C++.

Стандартная библиотека языка C++ <fstream> включает множество функций для работы с файлами. Описание функций можно найти в сети или в учебниках по C++. Здесь же я опишу одну, которая позволит произвести чтение строки из файла.

Содержание файла strings.txt

Три строки, содержащиеся в файле, я запишу массив и выведу на экран.

Пингвин читает содержимое файла

Переходим к написанию программы на C++.

Нашей программе понадобятся два заголовочных файла <iostream> и <fstream>. Первый нужен будет для использования вывода на консоль, второй для работы с файлами.

Объявим две целочисленные константы len и strings, они будут хранить максимальную длину наших строк и количество строк. Объявим символьную константу ch, которая будет хранить разделяющий символ. Первые две константы будут использоваться для объявления массива. Мой файл содержит 3 строки

При помощи значений двух первых констант объявим двумерный массив символов.

Создадим объект класса ostream, в конструктор поместим адрес файла, флаги открытия.

Флаг ios::in позволяет открыть файл для считывания, ios::binary открывает его в двоичном режиме.

Далее стоит проверить открылся ли файл, если не открылся, то завершаем работу программы.

В данный момент программа имеет такой вид

Теперь остается описать алгоритм считывания строк из файла и занесения их в массив с последующим выводом. Для этого понадобится цикл от нуля до strings с инкрементом переменной r. Во время каждого прохода цикла используем перегруженную функцию getline() объекта fs с тремя аргументами.

fs.getline(Массив_символов, Макс_длина_строки, Разделитель_строк)

Функция считывает символы из файла, пока не считает количество равное Макс_длина_строки, либо не встретит на своём пути символ равный Разделитель_строк, а после записывает считанные символы в Массив_символов. В качестве разделителя в моём текстовом файле используется перенос строки.

После сразу же выводим содержимое строки, хранящееся в массиве, при помощи поточного вывода в консоль cout.

Весь листинг конечной программы

За счет константных переменных её можно легко модернизировать. Изменив константу strings, можно указать количество выводимых строк. Чтение из файла будет производится до тех пор, пока массив не заполнится нужным количеством строк. Изменив константу ch, можно изменить разделитель строк(Например, можно разделять их пробелом и занести в массив отдельные слова из файла и т.д.).

Если Вас интересует запись в файл, то почитайте статью о чтении из input.txt и записи данных в файл output.txt.

Пример работы string и пример считывания всех строк из файла в массив с последующим выводом

Примеры использования средств C++ для работы с файлами

В теме приводятся примеры использования файловой системы C++ для:

  • чтения информации из файлов;
  • записи информации в файлы.

Содержание

  • 1. Функция, читающая строки из клавиатуры и записывающая их в файл
  • 2. Функция, которая читает текстовый файл и выводит его содержимое на экран
  • 3. Пример бесформатного ввода/вывода. Копирование одного файла в другой
  • 4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()
  • 5. Пример функции записывающей структурную переменную в файл
  • 6. Пример чтения структурной переменной из файла
  • 7. Пример чтения/записи массива структур в файл. Функции write() , read()
  • 8. Пример записи/чтения массива чисел типа double
  • 9. Пример чтения из файла строк. Функция getline()
  • 10. Пример чтения строк из файла. Функции getline() + eof()

Поиск на других ресурсах:

1. Функция, читающая строки из клавиатуры и записывающая их в файл

Результат работи программы:

2. Функция, которая читает текстовый файл и выводит его содержимое на экран

Функция Example2() читает содержимое файла filename , имя которого есть входящим параметром функции.

3. Пример бесформатного ввода/вывода. Копирование одного файла в другой

В примере реализована функция Example3() , которая выполняет копирование файлов в двоичном (бинарном) формате. Функция получает два параметра. Первый параметр типа const char* есть имя файла-источника. Второй параметр типа const char* есть имя файла-назначения.
Функция реализует посимвольное копирование. Для получения символа из файла-источника используется функция get() .

Вызов функции Example3() из функции main() может быть следующим:

4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()

Функция Example4() из данного примера работает также как и предыдущая, только вместо вывода в поток << используется функция put() . Также, с помощью функции is_open() выполняется проверка на корректность открытия файла.

5. Пример функции записывающей структурную переменную в файл

По данному примеру можно реализовывать собственные функции, которые будут записывать структуры или классы в файл.

Реализована функция Example5() , которая выполняет запись структурной переменной типа BOOK в файл, имя которого есть входящим параметром. Функция Example5() использует функцию write() для записи. Файл открывается в двоичном формате ( ios::binary ).

6. Пример чтения структурной переменной из файла

Данный пример есть продолжением предыдущего примера из пункта 5. В примере в функции Example6() заполняется значение структурной переменной типа BOOK . Полученное значение формируется как входящий параметр-ссылка на тип BOOK . Также функция получает параметром имя файла для чтения. Для чтения структурной переменной используется функция read() .

Результат работы программы

8. Пример записи/чтения массива чисел типа double
  • запись в файл массива M чисел типа double функцией write() ;
  • чтение из файла массива чисел типу double функцией read() .

Файл открывается в двоичном формате.

Результат работи программы:

9. Пример чтения из файла строк. Функция getline()
10. Пример чтения строк из файла. Функции getline() + eof()

В примере реализована функция Example10() , которая выполняет чтение строк из файла. Файл открывается в текстовом формате. Имя файла задается входящим параметром функции. Определение конца файла выполняется с помощью функции eof() .

Читайте также: