Как считать массив из файла c

от admin

Как считать массив из файла?

Программа должна считывать массив из файла и искать в нём минимальный элемент, но что-то не получается нормально считать сам массив. В чем проблема?

Файл input.txt

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.11.43304

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как считать массив из файла c

Класс FileStream представляет возможности по считыванию из файла и записи в файл. Он позволяет работать как с текстовыми файлами, так и с бинарными.

Создание FileStream

Для создания объекта FileStream можно использовать как конструкторы этого класса, так и статические методы класса File. Конструктор FileStream имеет множество перегруженных версий, из которых отмечу лишь одну, самую простую и используемую:

Здесь в конструктор передается два параметра: путь к файлу и перечисление FileMode . Данное перечисление указывает на режим доступа к файлу и может принимать следующие значения:

Append : если файл существует, то текст добавляется в конец файл. Если файла нет, то он создается. Файл открывается только для записи.

Create : создается новый файл. Если такой файл уже существует, то он перезаписывается

CreateNew : создается новый файл. Если такой файл уже существует, то приложение выбрасывает ошибку

Open : открывает файл. Если файл не существует, выбрасывается исключение

OpenOrCreate : если файл существует, он открывается, если нет — создается новый

Truncate : если файл существует, то он перезаписывается. Файл открывается только для записи.

Другой способ создания объекта FileStream представляют статические методы класса File:

Первый метод открывает файл с учетом объекта FileMode и возвращает файловой поток FileStream. У этого метода также есть несколько перегруженных версий. Второй метод открывает поток для чтения, а третий открывает поток для записи.

Закрытие потока

Класс FileStream для освобождения всех реусрсов, связанных с файлом, реализует интерфейс IDisposable. Соответственно после завершения работы с FileStream необходимо освободить связанный с ним файл вызовом метода Dispose. Для корректного закрытия можно вызвать метод Close() , который вызывает метод Dispose:

Либо можно использовать конструкцию using, которая автоматически освободит все связанные с FileStream ресурсы:

Свойства и методы FileStream

Рассмотрим наиболее важные свойства класса FileStream :

Свойство Length : возвращает длину потока в байтах

Свойство Position : возвращает текущую позицию в потоке

Свойство Name : возвращает абсолютный путь к файлу, открытому в FileStream

Для чтения/записи файлов можно применять следующие методы класса FileStream :

void CopyTo(Stream destination) : копирует данные из текущего потока в поток destination

Task CopyToAsync(Stream destination) : асинхронная версия метода CopyTo

void Flush() : сбрасывает содержимое буфера в файл

Task FlushAsync() : асинхронная версия метода Flush

int Read(byte[] array, int offset, int count) : считывает данные из файла в массив байтов и возвращает количество успешно считанных байтов. Принимает три параметра:

array — массив байтов, куда будут помещены считываемые из файла данные

offset представляет смещение в байтах в массиве array, в который считанные байты будут помещены

count — максимальное число байтов, предназначенных для чтения. Если в файле находится меньшее количество байтов, то все они будут считаны.

Task<int> ReadAsync(byte[] array, int offset, int count) : асинхронная версия метода Read

long Seek(long offset, SeekOrigin origin) : устанавливает позицию в потоке со смещением на количество байт, указанных в параметре offset.

void Write(byte[] array, int offset, int count) : записывает в файл данные из массива байтов. Принимает три параметра:

array — массив байтов, откуда данные будут записываться в файл

offset — смещение в байтах в массиве array, откуда начинается запись байтов в поток

count — максимальное число байтов, предназначенных для записи

Чтение и запись файлов

FileStream представляет доступ к файлам на уровне байтов, поэтому, например, если вам надо считать или записать одну или несколько строк в текстовый файл, то массив байтов надо преобразовать в строки, используя специальные методы. Поэтому для работы с текстовыми файлами применяются другие классы.

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

Посмотрим на примере считывания-записи в текстовый файл:

Разберем этот пример. Вначале определяем путь к файлу и текст для записи в файл.

И при чтении, и при записи для создания и удаления объекта FileStream используется конструкция using , по завершению которой у созданного объекта FileStream автоматически вызывается метод Dispose , и, таким образом, объект уничтожается.

Поскольку операции с файлами могут занимать продолжительное время и являются узким местом в работе программы, рекомендуется использовать асинхронные версии методов FileStream. И при записи, и при чтении применяется объект кодировки Encoding.Default из пространства имен System.Text . В данном случае мы используем два его метода: GetBytes для получения массива байтов из строки и GetString для получения строки из массива байтов.

В итоге введенная нами строка записывается в файл note.txt . И мы получим следующий консольный вывод:

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

То у нас могут возникнуть проблемы с его пониманием. Поэтому для работы непосредственно с текстовыми файлами предназначены отдельные классы — StreamReader и StreamWriter.

Произвольный доступ к файлам

Нередко бинарные файлы представляют определенную структуру. И, зная эту структуру, мы можем взять из файла нужную порцию информации или наоброт записать в определенном месте файла определенный набор байтов. Например, в wav-файлах непосредственно звуковые данные начинаются с 44 байта, а до 44 байта идут различные метаданные — количество каналов аудио, частота дискретизации и т.д.

Читать:
Как bin перевести в iso

С помощью метода Seek() мы можем управлять положением курсора потока, начиная с которого производится считывание или запись в файл. Этот метод принимает два параметра: offset (смещение) и позиция в файле. Позиция в файле описывается тремя значениями:

SeekOrigin.Begin : начало файла

SeekOrigin.End : конец файла

SeekOrigin.Current : текущая позиция в файле

Курсор потока, с которого начинается чтение или запись, смещается вперед на значение offset относительно позиции, указанной в качестве второго параметра. Смещение может быть отрицательным, тогда курсор сдвигается назад, если положительное — то вперед.

Рассмотрим простой пример:

Вначале записываем в файл текст «hello world». Затем снова обращаемся к файла для считывания. Сначала перемещаем курсор на пять символов назад относительно конца файлового потока:

чтение и запись файлов через FileStream в C#

То есть после выполнения этого вызова курсор будет стоять на позиции символа «w».

После этого считываем пять байт начиная с символа «w». В кодировке по умолчанию 1 символ будет представлять 1 байт. Поэтому чтение 5 байт будет эквивалентно чтению пяти сиволов: «world».

Соответственно мы получим следующий консольный вывод:

Рассмотрим чуть более сложный пример — с записью начиная с некоторой позиции:

Здесь также вначале записываем в файл строку «hello world». Затем также открываем файл и опять же перемещаемся в конец файла, не доходя до конца пять символов (то есть опять же с позиции символа «w»), и осуществляем запись строки «house». Таким образом, строка «house» заменяет строку «world».

Как считать массив из файла c

Файл input.txt введите сюда описание изображения

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ visual-c++ или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

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

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

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

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

Содержание

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

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

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

После вызова функции Example1() будет создан файл «myfile.txt» , в котором будут записаны строки, введенные с клавиатуры.

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

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

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

Результат работи программы отображает содержимое файла «myfile.txt» , созданного в п.1 этой темы

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

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

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

После выполнения функции Example3() будет создан файл «myfile2.txt» , который будет копией файла «myfile.txt» .

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()

В функции Example9() реализуется построчное чтение из файла с помощью функции getline() . Имя файла задается входящим параметром filename . Строки в файле состоят из набора слов, разделенных символом «пробел».

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

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

Похожие статьи