Файл: Pobegaylo_A._C_Cplus_dlya_studenta.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 13.12.2020

Просмотров: 4082

Скачиваний: 28

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

Часть IV. Стандартная библиотека языка программирования С++ 

506 

Второй  конструктор  также  создает  буфер  потока  посредством 
вызова  конструктора 

basic_filebuf<E,  T>()

,  а  затем  открывает 

файл,  на  имя  которого  указывает  параметр 

s

,  в  режиме 

mode|ios_base::in

. Возможные режимы открытия файла описаны 

в 

разд.  40.2.1.3

.  Если  открытие  файла  закончилось  неудачей,  то 

конструктор вызывает функцию 

setstate(failbit)

Функции-члены шаблона класса 

basic_ifstream<E, T>

 выполняют 

следующие действия: 

 

rdbuf

 — возвращает адрес буфера потока; 

 

open

 — открывает файл, на имя которого указывает параметр 

s

в  режиме 

mode|ios_base::in

.  Если  открытие  файла  закончи-

лось неудачей, то вызывает функцию 

setstate(failbit)

 

is_open

 —  возвращает  значение 

true

,  если  файл  открыт,  ина-

че — 

false

 

close

 —  закрывает  файл.  Если  файл  успешно  закрыт,  то  воз-

вращает указатель 

this

, иначе — пустой указатель. 

40.6.3. Шаблон класса 

basic_fstream

 

Шаблон  класса 

basic_fstream<E, T>

  имеет  следующий  интер-

фейс: 

  template <class E, class T = char_traits<E>> 
    class basic_fstream : public basic_iostream<E, T> 
  { 
  public: 
    basic_fstream(); 
    explicit basic_fstream(const char *s, 
      ios_base::openmode mode = ios_base::in|ios_base::out); 
    basic_filebuf<E, T> *rdbuf() const; 
    void open(const char *s, 
      ios_base::openmode mode = ios_base::in|ios_base::out); 
    bool is_open() const; 
    void close(); 
  }; 


background image

Глава 40. Потоки ввода/вывода в C++ 

507 

Параметр 

E

 шаблона задает тип символов, которые являются эле-

ментами  потока,  а  параметр 

T

  определяет  характеристики  этих 

символов.  Подробно  характеристики  символов  описаны  в 

разд. 39.1

Конструктор  по  умолчанию  создает  буфер  потока  посредством 
вызова  конструктора 

basic_filebuf<E,  T>()

,  а  затем  вызывает 

конструктор базового класса 

basic_ostream<E, T>

, передавая ему, 

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

basic_filebuf<E,  T>()

,  а  затем  открывает 

файл, на имя которого указывает параметр 

s

, в режиме 

mode

. Воз-

можные  режимы  открытия  файла  описаны  в 

разд.  40.2.1.3

.  Если 

открытие файла закончилось неудачей, то конструктор вызывает 
функцию 

setstate(failbit)

Функции-члены шаблона класса 

basic_ifstream<E, T>

 выполняют 

следующие действия: 

 

rdbuf

 — возвращает адрес буфера потока; 

 

open

 — открывает файл, на имя которого указывает параметр 

s

в режиме 

mode

. Если открытие файла закончилось неудачей, то 

вызывает функцию 

setstate(failbit)

 

is_open

 —  возвращает  значение 

true

,  если  файл  открыт,  ина-

че — 

false

 

close

 —  закрывает  файл.  Если  файл  успешно  закрыт,  то  воз-

вращает указатель 

this

, иначе — пустой указатель. 

40.6.4. Работа с текстовыми файлами 

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

>>

 

и  вывода 

<<

,  которые  выполняют  форматированный  ввод/вывод 

данных в поток. 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

508 

40.6.4.1. Создание текстового файла 

Пример создания текстового файла приведен в листинге 40.11. 

Листинг 40.11. Создание текстового файла 

#include <iostream> 
#include <fstream> 
using namespace std; 

int main() 

  ofstream out; 

  out.open("test.txt"); 

  out << "Integer: " << 10 << endl; 
  out << "Double: " << 20.5 << endl; 
  out << "String: " << "This is a string." << endl; 

  out.close(); 

  return 0; 

40.6.4.2. Чтение текстового файла 

Пример чтения текстового файла приведен в листинге 40.12. 

Листинг 40.12. Чтение текстового файла 

#include <iostream> 
#include <fstream> 
using namespace std; 

int main() 

  ifstream in; 
  char buf[80]; 

  in.open("test.txt"); 
  if (!in.is_open()) 


background image

Глава 40. Потоки ввода/вывода в C++ 

509 

  { 
    cerr << "Open file failed." << endl; 
    return 0; 
  } 

  while (!in.eof()) 
  { 
    in.getline(buf, 80); 
    cout << buf << endl; 
  } 

  in.close(); 

  return 0; 

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

40.6.4.3. Модификация текстового файла 

Следует  понимать,  что  текстовые  файлы —  это  файлы 

последо-

вательного

  доступа,  т. е.  содержимое  файлов  читается  последо-

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

40.6.5. Работа с бинарными файлами 

Под бинарными файлами понимаются файлы, в которых хранятся 
бинарные  данные,  т. е.  данные,  представленные  двоичными  ко-
дами. Такие файлы обычно хранят набор записей, каждая из ко-
торых является копией содержимого структуры, определенной в 
прикладной программе. При работе с бинарными файлами в язы-
ке  программирования  C++  нужно  придерживаться  следующих 
двух правил: 

 

поток,  связанный  с  бинарным  файлом,  должен  быть  открыт 
в бинарном режиме; 


background image

Часть IV. Стандартная библиотека языка программирования С++ 

510 

 

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

40.6.5.1. Создание бинарного файла 

Пример создания бинарного файла приведен в листинге 40.13. 

Листинг 40.13. Создание бинарного файла 

#include <iostream> 
#include <fstream> 
using namespace std; 
 
struct emp 

  int code; 
  char name[20]; 
  double salary; 
}; 
 
int main() 

  ofstream out;    // выходной поток 
  struct emp s;    // для записей файла 
  int n; 
 
  // открываем выходной поток в бинарном режиме 
  out.open("demo.bin", ofstream::binary); 
 
  cout << "Input a number of records: "; 
  cin >> n; 
  cout << "Input code, name and salary." << endl; 
  for (int i = 0; i < n; ++i) 
  { 
    cout << '>'; 
    // вводим следующие записи с консоли 
    cin >> s.code >> s.name >> s.salary; 
    // пишем запись в файл 
    out.write((const char*)&s, sizeof(struct emp)); 

  } 


Смотрите также файлы