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

от admin

Считать значения из input.txt и записать в output.txt на C++

На олимпиадах по программированию для ввода данных в программу используют, как правило, файл с названием input.txt(содержит входные данные), а для вывода используется output.txt(содержит все выходные данные). В данной статье мы разберем, как нам брать данные из файла input.txt и записывать в output.txt.

Из input.txt в output.txt

Может показаться, что это неудобно, и проще всего организовать ввод данных через консоль, попросив об этом пользователя примерно таким сообщением «Введите значение N:». Однако, использование файлов input.txt и output.txt позволяет автоматизировать проверку ответа участника олимпиады, что в разы ускоряет подведение итогов.

Если Вы любите решать олимпиадные задачи, то Вам просто необходимо иметь шаблон такой программы, чтобы каждый раз не реализовывать её. Ежели Вы впервые столкнулись с этим, то мы сейчас разберем, как это всё делается.

Мы уже говорили, как считывать данные из файла и записывать данные в файл посредством функций стандартной библиотеки <iostream> языка программирования C++. Давайте же применим наши знания в решении данной задачи.

Считывание и ввод данных из input.txt

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

Итак, для начала создадим файл input.txt, откроем с помощью текстового редактора и заполним его различными значениями. Я разместил пару чисел на одной строке, одно число на следующей строке, 10 чисел еще на одной строке и строку текста на последней. Файл input.txt содержит следующее:

Теперь напишем программу, которая будет брать все эти значения и заносить в нужные нам переменные.

Допустим, мне нужно занести первые два числа на первой строке(15 и 20) в переменные a и b соответственно.

Значение числа на второй строке(10) в переменную N, и при этом, договоримся, что на второй строке число указывает на количество чисел, размещенных на третей строке. То есть на третей строке у нас N чисел через пробел, их мы будем заносить в массив.

И, наконец, на четвёртой строке файла у нас расположено слово, его мы тоже занесем в переменную.

Теперь напишем программу, которая считает это всё и поместит в переменные, с которыми мы сможем работать. Я буду размещать код поэтапно, чтобы было понятно, что и где добавилось. Для начала Вы можете узнать как считывать из файла в C++.

Подключим необходимые заголовки

Откроем файл input.txt для чтения

Считаем первые два числа из файла input.txt в переменные a и b

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

Считаем число со второй строчки в переменную N

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

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

Теперь определяем массив с размером N и вносим в него следующие 10 чисел из файла

В результате массив mass[] заполнился следующими 10-ю числами из файла(числами с третьей строки).

И теперь считаем следующую за всем этим слово

Теперь выведем значения всех переменных в консоль

Определяем переменные и заносим в них наши значения, которые мы запишем в файл.

Откроем файл output.txt для записи.

Теперь, аналогично с обычным выводом в консоль, передаем в поток файла наши данные.

Теперь компилируем и запускаем программу, после чего открываем файл output.txt с помощью текстового редактора и видим записанные в него значения наших переменных, размещенных на разных строках.

Содержимое файла output.txt

Содержимое файла output.txt

Весь код программы для записи переменных в файл:

Вот мы и разобрались с выводом данных в файл output.txt.

Шаблон считывания данных из input.txt и записи в файл output.txt

Теперь создадим шаблон программы для использования в будущих решениях олимпиадных задач, чтобы каждый раз не писать один и тот же код для получения данных из input.txt и записи в output.txt.

Синтезируем две наши написанные программы и получим следующий код.

Вот и получился шаблон. Проверим его.

Допустим, нам нужно взять первое число из файла input.txt и записать его в файл output.txt.

Для этого просто определяем числовую переменную, считываем данные из потока fin, и выводим значение переменной в поток fout. Всё просто, вот так:

В файле input.txt у меня записано число 15, после запуска программы в файле output.txt появилось число 15. Всё работает, всё просто.

Итоги

Итак, мы научились получать данные из файла и записывать их в другой файл. Создали шаблон для будущих решений олимпиадных задач. Кстати, если вы решаете задачи по программированию на языке C++, то загляните в раздел с решениями задач. Если у Вас остались вопросы, то задавайте их в комментариях.

Для вас это может быть интересно:

Считать значения из input.txt и записать в output.txt на C++ : 5 комментариев

То чувство, когда с этим возишься дольше, чем с решением самой задачи.:)
Пример шаблона считывания и записи хороший, сохраню себе. Спасибо за идею.

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

Есть смысл построчно записывать в массив

Есть ли подобное на Basic?

Спасибо большое выручили

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

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

Gray Pipe

Лучший отвечающий

Вопрос

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

Числа разделены пробелами.

На паскале я бы сделал так:

Быстро и просто. Есть что-нибудь подобное в C# или нужно устраивать чтение по строкам и разбивать их на кусочки с помощью Split()?

Заранее спасибо за помощь!

  • Изменено Roman Gladkikh 3 декабря 2013 г. 9:21

Ответы

Добрый день, Роман.

Здесь не решают чужие задачи. Попробуйте решить задачу самостоятельно, а если что-то не получится, спрашивайте, мы вам поможем.

Ну а пока, давайте я вам посоветую с чего начать.

1. Вам надо считать текстовый файл. Для этого вам подойдет класс StreamReader. В конце там есть пример, как вывести все строки из файла на экран.

2. Т.к. вам надо не вывести строки, то вы можете считав строку, разбить ее по пробелам при помощи метода Split. Там есть пример, как посмотреть все части строки.

Класс BinaryReader . Работа с файлами в двоичном формате

Перед изучением данной темы рекомендуется ознакомиться со следующими темами:

Содержание

  • 4.1. Методы типа Read…() для чтения данных примитивных типов ( int , bool , double , …)
    • 4.1.1. Метод ReadBoolean()
    • 4.1.2. Методы ReadByte() и ReadBytes()
    • 4.1.3. Методы ReadChar() и ReadChars(int)
    • 4.1.4. Методы чтения данных с плавающей запятой ReadDecimal() , ReadDouble() , ReadSingle()
    • 4.1.5. Методы ReadInt16() , ReadInt32() , ReadInt64() чтения данных типа int
    • 4.1.6. Метод ReadSByte() . Чтение данных типа sbyte
    • 4.1.7. Метод ReadString() . Чтение строки типа string
    • 4.1.8. Методы считывания данных беззнакового целого типа

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

    1. Классы BinaryReader и BinaryWriter . Назначение. Общая информация

    Классы BinaryReader и BinaryWriter предназначены соответственно для чтения и записи данных в двоичном формате.

    Для чтения данных примитивных типов и строк из потока используется класс BinaryReader . При чтении можно указать необходимую кодировку. По умолчанию установлена кодировку UTF-8.

    Класс BinaryWriter используется для записи в поток стандартных типов данных и строк в двоичном формате. Существует возможность указания кодировки (по умолчанию UTF-8).

    Классы реализованы в пространстве имен System.IO . Для того, чтобы использовать возможности классов BinaryReader , BinaryWriter нужно подключить System.IO

    2. Взаимодействие класса BinaryReader с потоками опорных хранилищ. Использование класса FileStream

    Как известно, классы BinaryReader и BinaryWriter относятся к адаптерам потоков. Непосредственно взаимодействовать с различными видами хранилищ классы не могут. Для того, чтобы подойти к файловому, сетевому или иному виду хранилища нужно:

    • создать экземпляр соответствующего класса как потока. Это может быть экземпляр одного из четырех классов FileStream , IsolatedStorageStream , MemoryStream или NetworkStream ;
    • связать созданный экземпляр с экземпляром класса BinaryReader или BinaryWriter .

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

    C#. Взаимодействие класса BinaryReader с файлом с помощью класса FileStream

    Рисунок 1. Взаимодействие класса BinaryReader с файлом с помощью класса FileStream

    3. Конструкторы класса BinaryReader . Создание экземпляра

    Класс BinaryReader имеет несколько конструкторов, наиболее используемые из которых следующие:

    • input – ссылка на абстрактный базовый класс Stream ;
    • encoding – система кодировки (Unicode, UTF32, UTF8 и другая). По умолчанию устанавливается система кодировки UTF8.

    Пример. В примере продемонстрировано создание экземпляра класса BinaryReader с кодировкой по умолчанию.

    4. Класс BinaryReader . Обзор основных методов

    Основные методы, читающие данные в классе — это методы, которые начинаются с префикса Read . Далее приведен перечень этих методов.

    4.1. Методы типа Read…() для чтения данных примитивных типов ( int , bool , double , …)

    Для считывания данных примитивных (стандартных) типов ( int , double , char и других) в двоичном формате используется ряд методов. Предварительно эти данные должны быть записаны методом Write() .

    Ниже дан перечень этих методов.

    4.1.1. Метод ReadBoolean()

    Общая форма метода

    Метод считывает значение типа bool из текущего потока и сдвигает текущую позицию на один байт.

    Пример. Считывание из файла значения логического типа bool . Фрагмент кода предполагает, что это значение предварительно было записано методом Write() .

    4.1.2. Методы ReadByte() и ReadBytes()

    Метод ReadByte() считывает из потока один байт. Метод ReadBytes() считывает из потока несколько байт. Общая форма методов

    здесь count – количество считываемых байт.

    Пример. Приводится пример считывания данных методами ReadByte() и ReadBytes() .

    4.1.3. Методы ReadChar() и ReadChars(int)

    Методы используются для считывания одиночного символа типа char или нескольких символов типа char . Общая форма методов следующая:

    здесь count – количество символов, которые нужно прочитать из потока.

    Пример.

    4.1.4. Методы чтения данных с плавающей запятой ReadDecimal() , ReadDouble() , ReadSingle()

    Для чтения данных с алавающей запятой используются методы ReadDecimal() , ReadDouble() , ReadSingle() , которые считывают данные типов decimal , double и float соответственно. Общая форма методов следующая:

    Пример. В примере считывается массив вещественных чисел из файла.

    4.1.5. Методы ReadInt16() , ReadInt32() , ReadInt64() чтения данных типа int

    Для чтения данных типа int используются следующие методы:

    • ReadInt16() — считывает 2-байтовое знаковое целое число из текущего потока;
    • ReadInt32() — считывает 4-байтовое знаковое целое число из потока;
    • ReadInt64() — считывает 8-байтовое знаковое целое число из потока.

    Общая форма методов следующая

    Пример.

    4.1.6. Метод ReadSByte() . Чтение данных типа sbyte

    Метод ReadSByte() считывает данные типа sbyte . Общая форма метода:

    Пример.

    4.1.7. Метод ReadString() . Чтение строки типа string

    Для чтения одной строки из текущего потока используется метод ReadString() , который имеет следующую общую форму:

    Пример.

    4.1.8. Методы считывания данных беззнакового целого типа

    Для считывания беззнаковых целых типов используются методы ReadUint16() , ReadUint32() , ReadUint64() . Общая форма методов

    Пример.

    4.2. Метод Read()

    Метод Read() имеет несколько перегруженных реализаций. Ниже приведена общая форма наиболее употребляемых реализаций метода. Первая реализация метода не содержит параметров

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

    считывают соответственно определенное число байт или символов из потока, начиная с определенного потока в массиве байт.

    Пример.

    В примере демонстрируется использование метода Read() , который считывает массив байт типа byte[] . Сначала в файл записывается массив типа double[] . Затем этот массив считывается методом Read(byte[], int, int) .

    Пример также демонстрирует возможности класса BitConverter , который предназначен для преобразования различных типов в тип byte[] и, наоборот. Демонстрируется конвертирование чисел массива double[] в массив byte[] .

    Текст программы следующий.

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

    4.3. Метод PeekChar()

    Метод PeekChar() получает следующий имеющийся символ без прироста позиции байта или символа

    Если невозможно прочитать символ (например, конец файла), то метод возвращает -1.

    Пример. В примере в файл записывается строка, затем эта строка считывается посимвольно. Для определения того, можно ли прочитать символ, используется метод PeekChar() .

    Как считать число из файла 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 байта идут различные метаданные — количество каналов аудио, частота дискретизации и т.д.

    С помощью метода 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».

    Читать:
    Порт 1935 для чего

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