Как считать данные из файла в массив c
Обновлено: 21.11.2024
В этой статье обсуждаются два подхода к чтению текстового файла в двумерный массив в C++.
Использование fstream для чтения текстового файла в двумерный массив в C++
Чтобы прочитать наш входной текстовый файл в двумерный массив на C++, мы будем использовать функцию ifstream. Это поможет нам прочитать отдельные данные с помощью оператора извлечения.
Предположим, что наш текстовый файл содержит следующие данные.
Мы должны открыть файл и сказать компилятору, чтобы он считывал входные данные из файла. Мы будем использовать конструктор ifstream для создания файлового потока.
Как мы видим, мы объявили размер двумерного массива, определили inputfile и предоставили его адрес, используя ifstream.
Если текстовый файл находится в той же папке, укажите только имя и расширение. Однако, если текстовый файл находится в другой папке, обязательно вставьте полный адрес текстового файла из компьютерной системы.
После объявления файла мы используем циклы for для каждой строки и столбца, чтобы получить входные данные из текстового файла. И как только мы получили входные данные, вложенный цикл for выводит каждый элемент из массива.
Описанный выше метод подходит только для статических и квадратных двумерных массивов в C++, где известен размер массива. В противном случае компилятор установит входные данные из текстового файла в неправильные позиции внутри двумерного массива.
Если вы хотите определить двумерный массив в C++, который не является квадратом, нам нужно создать массив с количеством столбцов внутри первого цикла for.
Рассмотрите приведенный ниже пример определения неквадратного двумерного массива.
Чтение текстового файла в динамический двумерный массив на C++
Мы не используем массивы, если нам нужен текстовый ввод для динамической матричной структуры C++. Вместо этого мы используем векторы.
Вектор позволяет создавать динамически размещаемые массивы через интерфейс списков. Векторы могут увеличиваться, так как они используют память в кучах и автоматически освобождаются.
Предположим, что наш текстовый файл имеет следующие символы.
Чтобы создать двумерный вектор на C++, мы реализуем приведенный ниже код.
В приведенной выше программе мы успешно создали двумерный вектор. Затем мы открыли файл для ввода текста с помощью библиотеки ifstream.
Цикл while извлекал символы из текстового файла, используя стандартный метод getline. Затем переменная x используется для итерации каждой строки из текстового файла и помещения элемента обратно в вектор в каждой строке после того, как в текстовом файле встречается пробел.
После этого цикл снова использовал функцию push_back, чтобы переместить всю строку в двумерный вектор. Это повторяется для всех входных данных во всех строках, присутствующих в текстовом файле.
Второй цикл for используется для печати MyVector .
Статьи DelftStack написаны такими же фанатами программного обеспечения, как и вы. Если вы также хотите внести свой вклад в DelftStack, написав платные статьи, вы можете посетить страницу «Написать для нас».
сообщить об этом объявлении
чтение из файла и сохранение значений в массиве!! ПОМОГИТЕ, ПОЖАЛУЙСТА!! :О
Итак, у меня есть простая программа, которая должна считывать до 50 значений из файла .txt, сохранять значения в массиве и печатать значения пользователю. Однако, когда я запускаю программу, она просто ничего не выводит пользователю... просто пустое место, я не вижу никаких значений. я создал файл .txt и сохранил его в «Мои документы» на своем компьютере, поэтому я почти уверен, что программа знает, как получить к нему доступ. может быть, в моем коде есть еще одна ошибка, которую я не улавливаю?
Если кто-то хочет помочь, я был бы очень признателен за вашу помощь!
Спасибо
А вот мой код:
В этом коде нет ничего плохого, и пока файл voices.txt находится в текущем каталоге, из которого запускается программа, все должно работать нормально. Каково содержимое voices.txt?
Должно быть что-то вроде:
Вы действительно должны бросить i 23:59 . Причина: указал на необходимость проверки привязки в цикле while
О, хорошо, теперь я могу просто заменить весь цикл for на:
О-о-о, я только что увидел твой ответ. возможно, это моя проблема, потому что я не включил i
Как я уже сказал, в коде нет ничего, что мешало бы ему работать. Как вы его выполняете? Просто открывается быстрое всплывающее окно, а затем исчезает?
Что касается вашей логики, если каждое числовое значение представляет кандидата, то почему бы не сделать что-то вроде этого:
Хорошо, позвольте мне посмотреть, работает ли код, который вы мне дали. и это просто дает мне черное бегущее окно с пустым местом, где значения должны быть напечатаны, а затем:
"Процесс вернул 0 (0x0) время выполнения: 0,031 с
Нажмите любую клавишу, чтобы продолжить."
Добро пожаловать на форум, кал!
Ваш файл не открывается. Ваша программа будет работать, только если файл данных будет перемещен или скопирован в тот же каталог, в котором он находится.
Не "Мои документы". Должен быть тот же самый каталог. Вы не видите сообщение об ошибке, потому что окно консоли закрывается до того, как вы видите это сообщение.
Хорошо, вы спросили, как я это выполняю — я использую кодовые блоки, просто создаю и запускаю программу. Хорошо, поэтому я использовал код, который вы только что мне дали (кандидатный), и он, наконец, выводит некоторые результаты. Спасибо!! Единственная проблема заключается в том, что мне нужно ограничение размера до 50 (потому что что, если у меня больше 50 номеров?), но я попытаюсь выяснить это самостоятельно. Кроме того, результат, который я получаю:
Процесс вернул 0 (0x0) время выполнения: 0,031 с
Нажмите любую клавишу, чтобы продолжить.
В моем случае есть только 5 кандидатов, поэтому игнорируйте вывод от «кандидат 5» до «кандидат 9». Просто посмотрите на подсчет голосов кандидатов до «кандидата 4». Почему-то там написано, что все 5 кандидатов набрали 0 голосов. как мне заставить программу распечатать количество голосов, которые есть у каждого кандидата? Пожалуйста, дайте мне небольшие подсказки, я постараюсь понять большую часть этого самостоятельно. Было бы несправедливо, если бы вы сделали мою домашнюю работу за меня, ха-ха :P
У меня есть текстовый файл с разными именами (по одному в каждой строке). Я пытаюсь сохранить каждое имя в массиве, который позже будет отсортирован по алфавиту, но продолжает получать ошибку. Текстовый файл содержит 500 тыс. имен, каждое в отдельной строке, но я пока пытаюсь сделать только первую пару.
Фрагмент кода:
Ошибка, которую я продолжаю получать:
Первая пара строк текстового файла с именами:
Вот что я обычно делаю в подобных ситуациях:
Прочитайте весь файл в массив, используя fread. Либо выделите достаточно памяти для файла заранее, либо используйте realloc, чтобы расширить его при необходимости.
Просмотрите файл и замените новые строки нулевыми символами.
Поскольку я заменяю символы новой строки нулями, следите за тем, где начинается каждая строка (т. е. с первого символа новой строки после новой строки), и создавайте массив указателей на символы. Замените как '\n', так и '\r'. Вы также можете использовать realloc для расширения массива, когда это необходимо.
Сортировка указателей символов. Операция сортировки не повлияет на буфер, содержащий фактические символы из файла.
Поживи немного, используй mmap для всего
Что должна делать эта строка? Как вы думаете, что такое store_str[i]?
В этой строке я пытаюсь отсканировать слово, содержащееся в буфере 'строка', в массив Stored_str с индексом 'i', который начинается с 0. Я думаю, что ```stored_str[i]``` - это массив char, для которого доступно 500 000 слотов.
Я сижу на смартфоне, поэтому постараюсь объяснить, как смогу. Этот метод я использую. Некоторые могут предпочесть другие.
Вам нужен список указателей: каждый указатель указывает на отдельную строку.
Вы должны выделить память для хранения указателей на все строки: char *lines = malloc(sizeof(char) * max_num_lines);
Затем вам нужно выделить каждую строку перед вызовом fgets: char *line = malloc(sizeof(char) * max_line_length);
Затем вы назначаете каждую прочитанную строку массиву строк: lines[i] = line;
И я думаю, что нет необходимости использовать scanf.
Я никогда не делал ничего подобного, но подход, который приходит мне в голову, заключается в том, чтобы вставлять имена в структуру данных trie по мере их чтения. Это позволит вам сортировать файл по ходу работы. Если вы решите остаться с массивом, я бы рекомендовал использовать массив указателей, что ускорит сортировку, поскольку вам нужно только перемещать указатели для перемещения имен, а не копировать их.
Что такое sscanf Я думаю, что это fscanf, если вы хотите скопировать из файла
Чтение построчно допустимо. Но хранить их в массиве символов неправильно. Вам нужно сохранить их в массиве строк. Итак, ваш массив символов; должен быть массивом указателей "char *". Это должно упростить вашу работу при сортировке содержимого массива.
И вам необходимо динамически создать массив указателей "char *". Или вы можете объявить свою переменную следующим образом;
Имейте в виду, что вы можете получить сообщение об ошибке "Ошибка сегмента"; если недостаточно памяти для выделения.
Это наивный способ сделать это, требующий malloc и копии для каждой строки. Предполагается, что максимальная длина строки составляет 256 строк.
Если производительность имеет большое значение, я бы прибегнул к использованию одного malloc с вызовом fread(), как говорится в верхнем комментарии, и использовал массив указателей вторичной индексации char, чтобы указать на определенные индексы в этом массивном необработанном буфере после обнуления. '\n' и '\r'. Вам нужно будет перебрать буфер, чтобы определить, где начинаются ваши отдельные строки, и назначить их соответствующим образом. Это очень подвержено ошибкам, если вы не обращаете внимания, однако это «хороший» способ сделать это. Если вас не устраивают указатели, используйте мой (полностью непроверенный и не скомпилированный без проверки ошибок) пример.
C++ — это мощный язык, предоставляющий нам способы чтения данных из файлов и записи данных обратно в них. Файлы — это способ постоянного хранения данных на диске, чтобы данные не были потеряны при завершении выполнения программы. Часто нам нужно получить данные с диска, чтобы обработать их в наших программах. В этой статье мы обсудим, как читать файл в массив в C++.
Как объявить массив в C++?
Прежде чем обсуждать код, давайте посмотрим, как массивы работают в C++.
Массивы в C++ — это непрерывные участки памяти под одним именем. Мы используем массивы для хранения связанных данных с одним и тем же типом данных вместе под одним именем. В C++ мы определяем массив, используя следующий синтаксис.
Например, мы будем использовать следующую инструкцию для создания массива с именем myArr, который может хранить пять элементов строкового типа данных.
После определения массива мы можем получить доступ к элементам массива, используя их индексы. Массивы в C++ индексируются с использованием индексации на основе 0. Это означает, что первый элемент имеет индекс 0, второй элемент имеет индекс 1, третий элемент имеет индекс 2 и так далее. Последний элемент в массиве размера N имеет индекс (N-1).
Как открыть файл в C++?
Файлы используются для постоянного хранения данных на диске. Данные в основной памяти являются энергозависимыми и не могут храниться вечно. Как только вы закрываете программу, данные программы удаляются из основной памяти, чтобы другие программы могли использовать пространство памяти. Поэтому файлы необходимы для хранения данных на устройствах хранения в течение более длительного времени. C++ предоставляет простой и эффективный способ чтения и записи данных в файлы. Теперь мы рассмотрим различные библиотеки и их методы для выполнения файловых операций в C++.
Библиотеки C++ для работы с файлами
C++ предоставляет три библиотеки для выполнения файловых операций, таких как открытие файла, чтение файла и запись в файл.
- ofstream: вы можете использовать эту библиотеку для записи в файл на C++. Для этого вы можете включить в свою программу библиотеку ofstream для записи данных в файл.
- ifstream: вы можете использовать эту библиотеку для чтения данных из файла на C++. Для этого вы можете включить в свою программу библиотеку ifstream для выполнения операций чтения файлов.
- fstream: вы можете использовать эту библиотеку для выполнения операции чтения и записи файла на C++. Для этого вы можете включить библиотеку fstream для выполнения всех файловых операций в вашей программе.
Дополнительная литература:
Чтение CSV-файла на C++
Подсчет строк в файле на C++
Открытие файла в C++
Вы можете открыть файл в C++ двумя способами. Либо вы можете открыть файл при объявлении объекта файлового потока, передав имя файла в качестве входного аргумента конструктору. Или вы можете открыть файл после создания объекта файлового потока с помощью метода open(). Давайте обсудим оба способа открытия файла в C++ один за другим.
Открыть файл на C++, передав имя файла в конструктор файлового потока в качестве параметра
В этом разделе мы обсудим синтаксис открытия файла с использованием различных библиотек в C++ при создании объекта файлового потока.
Вы можете открыть файл с помощью библиотеки ifstream на C++, используя следующий синтаксис.
Здесь файл открывается только для операций чтения. Параметры конструктора задаются следующим образом:
- имя файла: строка, представляющая имя открываемого файла.
- режим: флаги, представляющие режим ввода-вывода для открытого файла.
Вы можете заметить, что значение по умолчанию для режима уже было описано как ios_base::in, т. е. режим ввода. Итак, чтобы открыть файл, вам просто нужно передать имя файла конструктору ifstream следующим образом.
Кроме того, вы можете использовать библиотеку ofstream, чтобы открыть файл на C++, объявив объект файлового потока, используя следующий синтаксис.
Конструктор ofstream используется для открытия файла в режиме записи. Параметры такие же, как и для конструктора ifstream. Однако мы изменили значение по умолчанию для режима на ios_base::out. Это означает, что файл будет открыт в режиме записи.Опять же, вы можете открыть файл в режиме записи с помощью библиотеки ofstream, просто передав имя файла конструктору ofstream следующим образом.
Еще один способ открыть файл в C++ — использовать библиотеку fstream. Здесь мы откроем файл в режиме чтения и записи. Итак, мы передаем оба значения ios_base::in и ios_base::out в качестве значения по умолчанию для режима, как показано ниже.
Библиотека fstream открывает файл как в режиме чтения, так и в режиме записи. Опять же, вы можете открыть файл в режиме чтения и записи в C++, просто передав имя файла конструктору fstream следующим образом.
Открыть файл в C++ с помощью функции open()
Вместо передачи имени файла конструкторам объекта файлового потока вы можете использовать метод open() для открытия файла в C++. Синтаксис использования метода open() в библиотеках следующий.
- ifstream_object.open(const char* имя файла, ios_base::openmode mode = ios_base::in);
- ofstream_object.open(const char* имя файла, ios_base::openmode mode = ios_base::out);
- fstream_object.open (const char* имя файла, ios_base::openmode mode = ios_base::in | ios_base::out);
Функция open() принимает параметры, аналогичные тем, которые определены в конструкторе. Значение параметров также остается прежним.
До сих пор мы обсуждали, как мы можем использовать файлы и массивы. Давайте теперь обсудим программу чтения файла в массив на C++.
Программа для чтения файла в массив на C++
В следующей программе мы определили массив размером 100 000. После этого мы прочитали файл в массив, используя библиотеку fstream на C++. Вы можете заметить, что мы прочитали файл построчно, а затем сохранили его в массиве. Хотя даны комментарии, мы объяснили программу построчно после вывода для вашего лучшего понимания.
Пример текстового файла, используемого в этой программе, выглядит следующим образом.
Введите имя файла:sample.txt
Здравствуйте, это пример программы.
Это чтение файла в массив.
Каждая строка представляет собой отдельный элемент массива.
Отчетливо видно, что каждая строка в файле была прочитана и сохранена в массиве, который затем отображается в качестве вывода.
Пояснение к коду
Во-первых, мы включили следующие файлы заголовков, которые использовались в программе.
- iostream: используется для операций ввода-вывода.
- fstream : использовался для операций с файлами.
- строка: используется для того, чтобы мы могли использовать строковые переменные в программе.
После включения заголовочных файлов переменная SIZE использовалась для объявления размера массива, в котором будет считываться файл. Поскольку массивы имеют фиксированный размер, мы объявили массив большого размера, чтобы данные файла можно было поместить в массив без переполнения.
Затем мы использовали оператор cout, чтобы предложить пользователю ввести имя файла, который нужно прочитать. Будьте внимательны, чтобы указать полный путь, если файл не существует в той же папке, где хранится файл кода. Имя файла было прочитано с помощью оператора cin. Затем мы объявили строковую переменную line для чтения каждой строки из файла, целое число i для подсчета строк и массив с именем arr of strings для хранения каждой строки, прочитанной из файла.
Затем мы использовали конструктор ifstream для создания объекта файлового потока для чтения файла. Мы передали имя файла, который должен быть открыт при создании объекта файлового потока с именем mFile. Режим открытия по умолчанию — режим ввода.
Следующая строка проверяет, был ли файл успешно открыт, в противном случае в остальной части условия отображается соответствующее сообщение о том, что программе не удалось открыть файл.
В цикле while !mFile.eof() проверяет, достигнут ли конец файла или нет. В цикле мы извлекаем строку из файла и помещаем ее в массив. Каждый раз мы увеличиваем текущий индекс массива на 1 (переменная i). Этот процесс повторяется до тех пор, пока программа не достигнет конца файла.
Наконец, содержимое массива отображается с помощью цикла for.
Выводы
C++ — это мощный язык с множеством функций для выполнения различных задач. Вы можете очень эффективно выполнять различные операции с файлами на C++, используя встроенные библиотеки. В этой статье мы обсудили основы того, как открыть файл в C++ в разных режимах. Затем мы обсудили программу для чтения файла в массив на C++. Для этого мы считывали входные данные из файла построчно и сохраняли каждую строку в массиве как отдельный элемент. Вы можете использовать концепции, обсуждаемые в программе, для написания лучшего кода для ваших приложений.
Читайте также: