КИТ и Э КБГУ Вторник, 07.05.2024, 03:08
Приветствую Вас Гость | RSS
Меню сайта

Наш опрос
Оцените мой сайт
Всего ответов: 118

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

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

  1. Запись данных в файл
  2. Чтение данных из файла
  3. Режимы открытия файлов

 

Запись данных в файл

Файл – именованный набор  байтов, который может быть сохранен на некотором накопителе. Ну, теперь ясно, что под файлом понимается некоторая последовательность байтов, которая имеет своё, уникальное имя, например файл.txt. В одной директории  не могут находиться файлы с одинаковыми именами.

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

В <fstream> определены несколько классов и подключены заголовочные файлы <ifstream> - файловый ввод и  <ofstream>  - файловый вывод.

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

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

  1. создать объект класса ofstream;
  2. cвязать объект класса с файлом, в который будет производиться запись;
  3. записать строку в файл;
  4. закрыть файл.

Почему необходимо создавать объект класса ofstream, а не класса ifstream? Потому, что нужно сделать запись в файл, а если бы нужно было считать данные из файла, то создавался бы объект класса ifstream.

Создаём объект для записи в файл

ofstream /*имя объекта*/;

Назовём объект – fout, Вот что получится:

ofstream fout;

 

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

Fout.open(«cppstudio.txt»); // связываем объект с файлом

 

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

fout << «Работа с файлами в С++»; // запись строки в файл

 

Используя операцию передачи в поток совместно с объектом fout строка «Работа с файлами в С++» записывается в файл. Так как больше нет необходимости изменять содержимое файла, его нужно закрыть, то есть отделить объект от файла.

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

Итог – создан файл со строкой Работа с файлами в С++.

Шаги 1 и 2 можно объединить, то есть в одной строке создать объект и связать его с файлом. Делается это так:

ofstream fout(«cppstudio.txt»); // создаём объект класса ofstream и связываем его с файлом cppstudio.txt

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

#include «stdafx.h»

#include <fstream>

using namespace std;

 

int main()

{

    ofstream fout(«cppstudio.txt»); //связываем его с файлом cppstudio.txt

    fout << «Работа с файлами в С++»; // запись строки в файл

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

    return 0;

}

Чтение данных из файла

Для того чтобы прочитать файл понадобится выполнить те же шаги, что и при записи в файл с небольшими изменениями:

  1. создать объект класса ifstream и связать его с файлом, в который будет производиться запись;
  2. прочитать файл;
  3. закрыть файл.

#include "stdafx.h"

#include <fstream>

#include <iostream>

using namespace std;

 

int main()

{

    setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы

    char buff[50]; // буфер промежуточного хранения считываемого из файла текста

    ifstream fin("cppstudio.txt"); // открыли файл для чтения

    fin >> buff; // считали первое слово из файла

    cout << buff << endl; // напечатали это слово

    fin.getline(buff, 50); // считали строку из файла

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

    cout << buff << endl; // напечатали эту строку

    system("pause");

    return 0;

}

 

В программе показаны два способа чтения из файла, первый – используя операцию передачи в поток, второй – используя функцию getline().

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

В С++ предусмотрена функция - is_open(), которая возвращает целые значения: 1 — если файл был успешно открыт, 0 — если файл открыт не был. Доработаем программу с открытием файла, таким образом, что если файл не открыт, выводилось соответствующее сообщение.

#include "stdafx.h"

#include <fstream>

#include <iostream>

using namespace std;

 

int main()

{

    setlocale(LC_ALL, "rus"); // корректное отображение Кириллицы

    char buff[50]; // буфер промежуточного хранения считываемого из файла текста

    ifstream fin("cppstudio.doc"); // (ВВЕЛИ НЕ КОРРЕКТНОЕ ИМЯ ФАЙЛА)

    if (!fin.is_open()) // если файл не открыт

        cout << "Файл не может быть открыт!\n"; // сообщить об этом

    else

    {

    fin >> buff; // считали первое слово из файла

    cout << buff << endl; // напечатали это слово

    fin.getline(buff, 50); // считали строку из файла

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

    cout << buff << endl; // напечатали эту строку

    }

    return 0;}

Режимы открытия файлов

Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios_base предусмотрены константы, которые определяют режим открытия файлов (см. Таблица 1).

Таблица 1. Режимы открытия файлов

Константа

Описание

ios_base::in

открыть файл для чтения

ios_base::out

открыть файл для записи

ios_base::ate

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

ios_base::app

открыть файл для записи в конец файла

ios_base::trunc

удалить содержимое файла, если он существует

ios_base::binary

открытие файла в двоичном режиме

 

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

ofstream fout("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла

fout.open("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла

 

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

Например: ios_base::out | ios_base::trunc - открытие файла для записи, предварительно очистив его.

Объекты класса ofstream, при связке с файлами по умолчанию содержат режимы открытия файлов  ios_base::out | ios_base::trunc. То есть файл будет создан, если не существует. Если же файл существует, то его содержимое будет удалено, а сам файл будет готов к записи.

Объекты класса ifstream связываясь с файлом, имеют по умолчанию режим открытия файла   ios_base::in  - файл открыт только для чтения.

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

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

Вход на сайт

Поиск

Календарь
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Архив записей

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

  • Copyright Fatima_Zh © 2024Бесплатный хостинг uCoz