Include fstream c что это
Перейти к содержимому

Include fstream c что это

Работа с файлами в 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()

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

              Потоковый ввод-вывод в файлы

              Работа с файлами с использованием конструкций языка Си была рассмотрена здесь.

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

              Для работы с файлами необходимо подключить заголовочный файл <fstream> . В нем определены несколько классов и подключены заголовочные файлы

              • <ifstream> — файловый ввод ;
              • <ofstream> — файловый вывод.

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

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

              При работе с файлом можно выделить следующие этапы:

              • создать объект класса fstream (возможно, ofstream или ifstream );
              • связать объект класса fstream с файлом, который будет использоваться для операций ввода-вывода;
              • осуществить операции ввода-вывода в файл;
              • закрыть файл.

              В результате будет создан файл
              Работа с файлами в C++

              Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios предусмотрены константы, которые определяют режим открытия файлов.

              Константа Описание
              ios::in открыть файл для чтения
              ios::out открыть файл для записи
              ios::ate при открытии переместить указатель в конец файла
              ios::app открыть файл для записи в конец файла
              ios::trunc удалить содержимое файла, если он существует
              ios::binary открытие файла в двоичном режиме

              Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове метода open() .

              Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции ИЛИ | , например:

              ios::out | ios::in — открытие файла для записи и чтения.

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

              Система ввода-вывода С++ позволяет осуществлять произвольный доступ с использованием методов seekg() и seekp() .

              • ifstream &seekg(Смещение, Позиция);
              • ofstream &seekp(Смещение, Позиция);

              Смещение определяет область значений в пределах файла ( long int ).

              Система ввода-вывода С++ обрабатывает два указателя, ассоциированные с каждым файлом:

              • get pointer g — определяет, где именно в файле будет производиться следующая операция ввода;
              • put pointer p — определяет, где именно в файле будет производиться следующая операция вывода.

              Позиция смещения определяется как

              Позиция Значение
              ios::beg Начало файла
              ios::cur Текущее положение
              ios::end Конец файла

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

              Можно определить текущую позицию файлового указателя, используя следующие функции:

              • streampos tellg() — позиция для ввода
              • streampos tellp() — позиция для вывода

              В результате выполнения первой части программы будет создан файл
              Создание файла
              Вторая часть программы выведет в консоль
              Считывание данных из файла

              Ещё один пример. Допустим, нам нужно заполнять таблицу

              ФИО Дата рождения Хобби

              Причем каждая вновь введенная строка должна размещаться в таблице непосредственно под «шапкой».

              Алгоритм решения задачи следующий:

              • формируем очередную строку для вывода
              • открываем файл для чтения, считываем из него данные и сохраняем их в массив строк
              • закрываем файл
              • открываем файл для записи
              • выводим «шапку» таблицы
              • выводим новую строку
              • выводим все сохраненные строки обратно в файл, начиная со строки после шапки

              #include <iostream>
              #include <fstream>
              using namespace std;
              #define LINES 100 // максимальное количество строк в файле
              int main() <
              system( "chcp 1251" );
              system( "cls" );
              char line[LINES][100];
              char str[30];
              char s[] = "| | | |" ;
              // Ввод данных для размещаемой строки
              cout << "ФИО: " ;
              cin.getline(str, 30); // вводим ФИО
              for ( int i = 0; str[i] != ‘\0’ ; i++) // копируем в строку без 0
              s[i + 2] = str[i]; // начиная с указанной позиции
              cout << "Дата: " ;
              cin.getline(str,30);
              for ( int i = 0; str[i] != ‘\0’ ; i++)
              s[i + 33] = str[i];
              cout << "Хобби: " ;
              cin.getline(str,30);
              for ( int i = 0; str[i] != ‘\0’ ; i++)
              s[i + 50] = str[i];

              fstream inOut;
              inOut.open( "file.txt" , ios::in); // открываем файл для ввода
              // Считываем из файла имеющиеся данные
              int count = 0;
              while (inOut.getline(line[count], 100)) count++;
              inOut.close(); // закрываем файл

              Результат выполнения:
              Ввод строки таблицы
              Ввод строки таблицы
              Ввод строки таблицы

              Полученный файл данных:
              Файл данных

              Комментариев к записи: 59

              ofstream fout( "file.txt" , ios::out);
              fout.open( "file.txt" , ios::out);
              for ( int i = 0; i < SIZE; i++)
              <
              for ( int j = 0; j < SIZE; j++)
              printf( "%5d " , a[i][j]);
              printf( "\n" );

              #include <fstream>
              #include <iostream>

              using namespace std;
              #define LINES 100

              int main( int argc, char * argv[]) <
              system( "chcp 1251" );
              system( "cls" );
              char line[LINES][150];
              char str[30];
              char s[] = "| | | | " ;
              cout << "Prizwyshce: " ;
              cin.getline(str, 30);
              for ( int i = 0; str[i] != '\0'; i++)
              s[i + 0] = str[i];
              cout << "Matematyka: " ;
              cin.getline(str, 30);
              for ( int i = 0; str[i] != '\0'; i++)
              s[i + 33] = str[i];
              cout << "Programywannya: " ;
              cin.getline(str, 30);
              for ( int i = 0; str[i] != '\0'; i++)
              s[i + 61] = str[i];
              cout << "Metrologiya: " ;
              cin.getline(str, 30);
              for ( int i = 0; str[i] != '\0'; i++)
              s[i + 97] = str[i];

              #include <iostream>
              #include <cstdlib>
              #include <fstream>
              #include <iomanip>
              #include <cmath>
              #include <string>
              using namespace std;

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

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