Как считать весь файл в строку c
Перейти к содержимому

Как считать весь файл в строку c

Как считать весь файл в строку c

Нужно прочитать файл в строку. кажется, я тут выдумал слишком сложный и кривой путь, так как не заню более простого. Читал вот так:

Однако, поле выснилось, что количество ситчанных символов не соответствует объему файла.. (( А мне нужно считать его точно: один в один!
К тому же. Метод getline для этого мне и вовсе не по душе, так как если строка имеет длину более чем MAGIC_NUMBER, приходит апокалипсис.
Научите, пожалуйста, как сделать такую операцию по-человечески. Спасибо!

От: LCR lj://_lcr_
Дата: 24.07.03 13:37
Оценка:

Здравствуйте, Аноним, Вы писали:

А> Однако, поле выснилось, что количество ситчанных символов не соответствует объему файла.. (( А мне нужно считать его точно: один в один!
А> К тому же. Метод getline для этого мне и вовсе не по душе, так как если строка имеет длину более чем MAGIC_NUMBER, приходит апокалипсис.
А> Научите, пожалуйста, как сделать такую операцию по-человечески. Спасибо!

Я бы сделал так

От: Аноним
Дата: 24.07.03 13:45
Оценка:

Здравствуйте, LCR, Вы писали:

LCR>Здравствуйте, Аноним, Вы писали:

А>> Однако, поле выснилось, что количество ситчанных символов не соответствует объему файла.. (( А мне нужно считать его точно: один в один!
А>> К тому же. Метод getline для этого мне и вовсе не по душе, так как если строка имеет длину более чем MAGIC_NUMBER, приходит апокалипсис.
А>> Научите, пожалуйста, как сделать такую операцию по-человечески. Спасибо!

LCR>Я бы сделал так
LCR>

Спасибо, но.
а считается-то нормально? Именно только сколько нужно.
А файл-то (в этой конкретной задаче) может быть от 2-3-х кб до 2-3-мб. :\ . может все-таки как-нибудь по-другому?

От: Димон
Дата: 24.07.03 14:01
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Нужно прочитать файл в строку. кажется, я тут выдумал слишком сложный и кривой путь, так как не заню более простого. Читал вот так:

А>

А> Однако, поле выснилось, что количество ситчанных символов не соответствует объему файла.. (( А мне нужно считать его точно: один в один!
А> К тому же. Метод getline для этого мне и вовсе не по душе, так как если строка имеет длину более чем MAGIC_NUMBER, приходит апокалипсис.
А> Научите, пожалуйста, как сделать такую операцию по-человечески. Спасибо!

Например, можно так:

От: Димон
Дата: 25.07.03 09:09
Оценка: 6 (1)

Пардон, не учел пропуски пробелов, возвратов каретки и пр. Если нужно их сохранять, то требуется вставить строку

Работа с файлами в C++. Часть 1 – Библиотека fstream.

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

Наиболее частые операции следующее:

    1. Операторы перенаправления ввода\вывода – << и >>
      1. Методы записи и чтения строк getline() и get() c put()
        1. Потоковая запись и чтение методами write() и read()
          1. Методы открытия\создания и закрытия файлов open() и close()
            1. Методы проверки открыт ли файл is_open() и достигнут ли конец файла eof()
              1. Настройка форматированного вывода для >> с помощью width() и precision()
              1. Операции позиционирования tellg(), tellp() и seekg(), seekp()

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

              Класс ifstream

              Предоставляет возможности для чтения файлов. Открыть файл можно двумя способами: вызвав метод open() или указав путь к нему в конструкторе. Вам необходимо подготовить текстовый файл, перед тем, как начать набирать код. На диске d создайте папку с именем 1 и в ней создайте файл с расширением txt – “файл.txt”.

              Открытие файла в конструкторе выглядит так:

              Так мы просим открыть файл txt с именем файл.txt, который лежит в папке с названием 1, а папка находится на диске d.

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

              Открыв файл, желательно прописать проверку: открылся ли он? Так как есть ряд причин, по которым файл может не открыться, а мы этого не увидим. Например, файла с указанным именем нет в прописанной папке или путь указан неверно. Можно пойти двумя путями: проверить переменную файла в логическом выражении (применив оператор “!”, к примеру) или использовать метод is_open() :

              Так все отработает нормально и файл откроется:

              библиотека fstream, работа с файлами в с++, программирование для начинающих

              Теперь попробуйте вписать название папки не 1, а 2 ifstream file ( «d:\\<span style crayon-v»>color : #ff0000;»><strong>2</strong> \\файл.txt”); и снова запустите программу. Так как папки с указанным именем мы не создавали, то и файл, естественно, не может быть открыт:

              библиотека fstream, работа с файлами в с++, программирование для начинающих

              Второй вариант проверки с использованием метода is_open() :

              Метод is_open() вернет 1, если файл найден и успешно открыт. Иначе вернет 0 и сработает код прописанный в блоке else .

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

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

              Оператор считывания >>

              Так же как и в iostream считывание можно организовать оператором >> , который указывает в какую переменную будет произведено считывание:

              Считает вещественное, целое и строку. Считывание строки закончится, если появится пробел или конец строки. Стоит отметить, что оператор >> применяется к текстовым файлам. Считывание из бинарного файла производить лучше всего с помощью метода read().

              Кстати этот оператор достаточно удобен, если стоит задача разделить файл на слова:

              Методы getline() и get()

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

              Если же читать нужно в массив символов char[], то либо get() либо getline() именно как методы:

              Принцип в общем тот же, что и в аналогах из iostream: Указывается в параметрах буфер (переменная, куда будет производиться чтение), или точнее указатель на блок памяти (если переменная объявлена статически: char buffer[255] к примеру, то пишется в параметры &buffer), указывается максимальное количество считываемого (в примере это n), дабы не произошло переполнение и выход за пределы буфера и по необходимости символ-разделитель, до которого будет считка (в примере это пробел). Надеюсь я не больно наступлю на хобот фанатикам Си, если сажу что эти две функции на 99% взаимозаменяемы, и на 95% могут быть заменены методом read() .

              Метод read()

              Похож на предыдущий пример?

              Собственно тут тот же результат – считается указанное количество символов. Исключение только в том, что нельзя указать разделитель. read() применяется для неформатированного ввода. Призван в первую очередь читать бинарные файлы. Поскольку текстовый файл – частный случай бинарного, этот метод вполне применим и к текстовому файлу.

              Метод close()

              Закрывает файл. Даже добавить нечего. Единственная пожалуй ремарка – от того, что файл, открытый для чтения, не будет закрыт этим методом как правило хуже не станет. Очень редки ситуации, когда открытый для чтения файл портится, если завершить программу не закрывая файл. Связана эта порча прежде всего с нестандартными устройствами типа стримеров на магнитной ленте или каких нибудь потоковых хитрых промышленных контроллерах, но по феншую стоит запомнить – открытый файл должен быть закрыт. Это считается хорошим тоном.

              Метод eof()

              Проверяет не достигнут ли конец файла. Т.е. можно ли из него продолжать чтение. Выше пример с считкой слов оператором >> как раз использует такую проверку.

              Метод seekg()

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

              Работа с файлами и другими потоками в Си\С++

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

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

              Файлы могут быть текстовыми и двоичными (типизированными). Вид файла определяется способом хранения информации в файле. В любом файле имеется указатель чтения/записи, который можно перемещать специальными функциями. После каждого чтения или записи указатель сдвигается на заданное (при чтении/записи) количество байт. Такой способ доступа называется последовательным.

              Текстовый файл можно рассматривать как набор строк произвольной длины, разделенных управляющим символом '\n' . Логически текстовый файл представляет собой цепочку байт, имеющую начало и конец. Чтение (или запись) из файла (в файл) ведется байт за байтом от начала к концу.

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

              Мы можем перенаправлять потоки в файлы. Такой механизм поддерживается уже на уровне операционной системы — при запуске программы можно указать какие файлы будут использоваться для перенаправления стандартных потоков ввода/вывода, например:

              Программа a.exe будет получать ввод из файла input_file (вместо клавиатуры), b.exe будет выводить данные в output_file (вместо экрана), программа c.exe будет получать ввод из in.txt и писать в out.txt , а программа d.exe выводит ошибки в файл err.txt .

              2.1 Работа с файлами в Си

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

              После этого к файлу можно применять специальные функции:

              1. fscanf/fprintf используются для форматированного ввода/вывода при работе с текстовыми файлами. Описаны эти функции с библиотеке stdio.h ( cstdio ) и являются аналогами функций scanf и printf, которые, в свою очередь используются для ввода с клавиатуры и вывода на экран;
              2. fread/fwrite для чтения/записи бинарных файлов

              2.2 Работа с файлами и потоками в C++

              Существует четыре стандартных потока: cout, cerr, clog для вывода, и cin для ввода. Чтобы работать с потоками, нужно включить заголовочный файл iostream. Так что для любого консольного приложения, нужно добавить следующую строчку:

              Частью стандартной библиотеки С++ является библиотека iostream, которая реализована как иерархия классов и обеспечивает базовые возможности ввода/вывода. Ввод с клавиатуры, называемый стандартным вводом, “привязан” к предопределенному объекту cin. Вывод на монитор, или стандартный вывод, привязан к объекту cout. Основным отличием файлового ввод/вывода является то, что ввод/вывод выполнятся не с клавиатуры и на экран, а из файла и в файл. Для организации файлового ввода/вывода достаточно создать собственные объекты, которые можно использовать аналогично cin и cout. Для работы с файлами с использованием потокового ввода-вывода необходимо подключить заголовочный файл <fstream> . В этом файле определены несколько классов и подключены заголовочные файлы – файловый ввод и <ofstream> – файловый вывод.

              Например, необходимо создать текстовый файл и записать в него строку «Скоро Новый год!». Для этого необходимо проделать следующие шаги:

              создать объект класса ofstream;
              связать этот объект с файлом, в который будет производиться запись;
              записать строку в файл;
              закрыть файл.
              Например, создаём объект fout для записи в файл:

              ofstream out ; // объект класса ofstream

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

              out.open("out.txt"); // связываем объект с файлом

              Указанный файл будет создан в текущей директории. Если файл с таким именем существует, то существующий файл будет заменен новым. Итак, файл открыт, записываем в него нужную строку:

              out << "Скоро Новый год!"; // запись строки в файл

              Так как больше нет необходимости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла.

              out.close (); // закрываем файл

              Шаги по созданию объекта и связыванию его с файлом можно объединить:

              Объединим весь код и получим следующую программу.

              При считывании данных из файла может произойти ситуация достижения конца файла (end of file, сокращенно EOF). После достижения конца файла никакое чтение из файла невозможно. Для того чтобы проверить состояние файла, необходимо вызвать метод eof(). Данный метод возвращает true, если конец файла достигнут или false, если не достигнут. Например, в файле в текстовом файле File.txt хранится последовательность целых чисел, необходимо их считать и найти сумму:

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

              Организацию считывания файла построчно (считая, что строка заканчивается символом перехода на новую строку) продемонстрируем на примере кодирования файла путем замены кода символа следующим кодом из таблицы ASCII :

              Пример входного файла

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

              1. Стандартный поток ввода — stdin;
              2. Стандартный поток вывода — stdout;
              3. Стандартный поток ошибок, этакий error_log — stderr;

              Начнем с практики — программа считывающая из input.txt и записывающая в output.txt :

              В этом примере работа с файлами идет через стандартные потоки ввода/вывода, но для того, чтобы перенаправить их в файл используется функция freopen . Константы "r" и "w" задают режимы работы с файлом. Всего есть 6 режимов:

              1) Считывание, или «r» , от слова read . Используется для потока ввода. Для считывания файл должен существовать.
              2) Запись, или «w» , от английского write . Используется для потока вывода. Если файла не существует, то он будет создан, иначе — перезаписан.
              3) Добавление, или «a» , от слова append . Используется для вывода, отличается от «w» тем, что продолжает записывать в файл, а не очищает его.
              4,5,6) Те же моды, с разницей в том, что их можно использовать и для ввода, и для вывода. Вот сами моды «r+» , «w+» , «a+» .

              Так же для считывания можно использовать функции ifstream и ofstream , которые находятся в библиотеке <fstream> .

              ifstream считывает с заданного файла. ofstream выводит в заданный файл.
              Теперь о том как их написать:
              ifstream название_функции_ввода («название_файла_ввода»);
              ofstream название_функции_вывода («название_файла_вывода»);

              Пример той же программы с использованием функций библиотеки fstream :

              Стоит отметить, что ifstream использует режим «a» , а ofstream — режим «w» . Можно открыть сколько угодно файлов, главное дать уникальное имя для функций ввода.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *