Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Использовать в одной программе потоки и функции библиотеки С, описанные в <cstdio> или <stdio. h>, не рекомендуется. Если это необходимо, то до выполнения первой операции с потоками следует вызвать описанную в ios_base функцию sync_with_stdio(), которая обеспечит использование общих буферов. Вызов sync_with_stdio(false) разъединяет буфера (это может привести к увеличению производительности).
9.4. Файловые потоки
Под файлом подразумевается именованная информация на внешнем носителе, например, на жестком или гибком магнитном диске. Логически файл можно представить как конечное количество последовательных байтов, поэтому такие устройства, как дисплей, клавиатуру и принтер также можно рассматривать как частные случаи файлов.
По способу доступа файлы можно разделить на последовательные у чтение и запись в которых производятся с начала байт за байтом, и файлы с произвольным доступом, допускающие чтение и запись в указанную позицию.
Стандартная библиотека содержит три класса для работы с файлами:
ifstream — класс входных файловых потоков;
ofstream— класс выходных файловых потоков;
fstream — класс двунаправленных файловых потоков.
Эти классы являются производными от классов istream, ostream и iostream соответственно, поэтому они наследуют перегруженные операции « и » , флаги форматирования, манипуляторы, методы, состояние потоков и т. д.
Использование файлов в программе предполагает операции: создание потока; открытие потока и связывание его с файлом; обмен (ввод/вывод); уничтожение потока; закрытие файла.
Каждый класс файловых потоков содержит конструкторы, с помощью которых можно создавать объекты этих классов различными способами.
• Конструкторы без параметров создают объект соответствующего класса, не связывая его с файлом: ifstream(); ofstream(); fstream():
• Конструкторы с параметрами создают объект соответствующего класса, открывают файл с указаннхым именем и связывают файл с объектом:
ifstream(const char *name. int mode = ios::in):
ofstream(const char *name. int mode = ios::out | ios::trunc):
fstream(const char *name. int mode = ios::in | ios::out):
Вторым параметром конструктора является режим открытия файла. Если установленное по умолчанию значение не устраивает программиста, можно указать другое, составив его из битовых масок, определенных в классе ios.
Открыть файл в программе можно с использованием либо конструкторов, либо метода open, имеющего такие же параметры, как и в соответствующем конструкторе, например:
ifstream inpf ("input. txt". . ios::in|ios:inocreate); //Использование конструктора
1f(!inpf){
cout « "Невозможно открыть файл для чтения": return 1:
}
ofStream f:
f. open("output. txt"); // Использование метода open
if (!f){
cout « "Невозможно открыть файл для записи";
return 1;
}
Чтение и запись выполняются либо с помощью операций чтения и извлечения, аналогичных потоковым классам, либо с помощью методов классов.
Пример использования методов (программа выводит на экран содержимое файла):
#include <fstream. h>
int main(){
char text[81]. buf[81]:
cout « "Введите имя файла:";
cшn » text;
ifstream f(text. ios::in|ios::nocreate):
i f (!f){
cout « "Ошибка открытия файла"; return 1;
}
while (!f. eof()){
f. getlineCbuf. 81);
cout « buf « end!;
}
return 0;
}
Для закрытия потока определен метод closeO, но поскольку он неявно выполняется деструктором, явный вызов необходим только тогда, когда требуется закрыть поток раньше конца его области видимости.
9.5. Строковые потоки
Строковые потоки позволяют считывать и записывать информацию из областей оперативной памяти так же, как из файла, с консоли или на дисплей. В стандартной библиотеке определено три класса строковых потоков;
istringstream — входные строковые потоки;
ostringstream — выходные строковые потоки;
stringstream — двунаправленные строковые потоки.
Эти классы определяются в заголовочном файле <sstream> и являются производными от классов istream, ostream и iostream соответственно, поэтому они наследуют перегруженные операции « и », флаги форматирования, манипуляторы, методы, состояние потоков и т. д.
Участки памяти, с которыми выполняются операции чтения и извлечения, по стандарту определяются как строки C++ (класс string). Строковые потоки создаются и связываются с этими участками памяти с помощью конструкторов.
Строковые потоки являются некоторым аналогом функций sscanf и sprintf библиотеки С и могут применяться для преобразования данных, когда они заносятся в некоторый участок памяти, а затем считываются в величины требуемых типов. Эти потоки могут применяться также для обмена информацией между модулями программы.
В строковых потоках описан метод str, возвращающий копию строки или устанавливающий ее значение:
string str() const:
void str(const string & s):
Проверять строковый поток на переполнение не требуется, поскольку размер строки изменяется динамически.
9.6. Потоки и типы, определенные пользователем
Для ввода и вывода в потоках используются перегруженные для всех стандартных типов операций чтения и извлечения « и » . При этом выбор конкретной операции определяется типом фактических параметров. Для того чтобы вводить и выводить величины типов, определенных пользователем, требуется перегрузить эти операции. Это бинарные операции, левым операндом которых является объект-поток, а правым — объект, который требуется извлечь или поместить в этот поток. Возвращаемое значение должно быть ссылкой на поток, чтобы можно было организовывать цепочки операций, как и в случае стандартных типов.
Пример. Пусть в программе определен класс MyClass:
class MyClass{
1 nt X:
float у;
Чтобы вводить и выводить объекты этого класса, требуется определить в классе MyClass операции следующего вида:
/ / Вывод:
friend ostream& operator « (ostream& out. MyClass& C){
return out « "x = " « C. x « " у = " « C. y:
}
// Ввод:
friend istream& operator » (istream& in. MyClass& C){
cout « "Введите x: ":in » C. x;
cout « "Введите у: ":in » C. y;
return in;
}
После этого в программе можно использовать объекты класса MyClass в операциях
ввода и вывода наряду с величинами стандартных типов:
#include <iostream. h>
class MyClass{
int x;
float y;
public:
MyClass(int nx = 1. float ny = 0.01){x = nx; у = ny;}
friend ostream& operator« (ostream& out. MyClass& C){
return out « "x = " « C. x « " у = " « C. y;
}
friend istream& operator» (istream& in. MyClass& C){
cout « "Введите x: "; in » C. x;
cout « "Введите у: "; in » Су;
return in;
}
}:
1nt ma1n(){
MyClass С:
cout « С « endl:
MyClass CKIOO. 100):
cout « CI « endl:
MyClass C2:
c1n » C2: cout « C2 « endl:
return 0:
}
Экземпляр С класса MyClass создается с параметрами конструктора по умолчанию, поэтому на экран будет выведено: X = 1 у = 0.01
Экземпляр С1 класса MyClass создается с параметрами 100, 100: X = 100 у = 100
После создания экземпляра С2 будет выведено приглашение ко вводу х и у, а затем введенные с клавиатуры значения будут выведены на экран.
10. Шаблоны
10.1. Основные понятия
С++ использует ключевое слово template для того, чтобы обеспечить параметрический полиморфизм. Параметрический полиморфизм позволяет одному и тому же коду использоваться относительно различных типов, где тип - параметр тела кода. Параметрический полиморфизм особенно полезен при определении контейнерных классов. Обработка данных в контейнерном классе имеет одну и ту же форму, независимо от типа. Шаблоны определения класса и шаблоны определения функции дают возможность многократно использовать код простым способом, безопасным по отношению к типу, который позволяет компилятору автоматизировать процесс реализации типа. Полиморфизм обеспечивает многократное использование кода.
Шаблон класса. Пример реализации шаблона stack
template <class TYPE>
class stack {
enum { EMPTY=-1};
TYPE *s;
int len, top;
public:
stack: len(1000) { s=new TYPE[1000]; top=EMPTY; }
stack(int size): len(size) { s=new TYPE[size]; top=EMPTY; }
~stack() { delete s; }
void reset() { top=EMPTY; }
void push(TYPE c) { s[++top]=c; }
TYPE pop() { return s[top--]; }
TYPE top_of() { return s[top]; }
boolean empty() { return boolean(top==EMPTY); }
boolean full() { return boolean(top==len); }
};
Синтаксис объявления класса предваряется template <class идентификатор>
где идентификатор - параметр шаблона, который, по существу, заменяет произвольный тип. Через определение класса аргумент шаблона может использоваться как имя типа. Этот аргумент создается при реализации экземпляра в фактических объявлениях. Пример использующего его объявления стека:
stack <char> stk_ch; // stack из 1000 элементов char
stack <char *> stk_str(200); // stack из 200 элементов char *
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |


