Файловые потоки
Для первых программ стандартных потоков ввода/вывода будет достаточно, но по мере усложнения программ не обойтись без работы с файлом, которая в С++ осуществляется так же на основе механизма потоков.
#include <fstream>
using namespace std;
void main()
{
ifstream inputfile("z:\\data.txt"); // создается поток ввода из файла
inputfile>>x; // все то же самое что и для cin
ofstream outputfile("z:\\res.txt"); // создается поток вывода в файл
outputfile<<x; // все то же самое что и для cout
}
Обратите внимание на двойной слэш \\ в имени файла. Это все из-за того, что \ - экранирующий символ.
По умолчанию ввод и вывод данных в поток осуществляется в текстовом режиме. Для того, чтобы данные выводились в двоичном режиме следует использовать следующую запись:
ofstream outfile(filename,ios::binary);
По умолчанию файл открываемый для вывода создается (если он создан), а если существует, то очищается. Для того чтобы открыть файл для добавления:
ofstream outfile(filename,ios::app);
Можно создать файловый поток, который запускает и ввод и вывод:
fstream iofile(filename,ios::in|ios::out);
Стандартная библиотека языка С++ предоставляет программистам строковый тип данных (избавляет от использования массивов символов char[ ]).
Мы будем использовать тип данных string наряду со стандартными встроенными типами данных. И вы на первый взгляд не будете замечать никаких различий, хотя на самом деле это абстрактный тип данных, созданный на основе объектно-ориентированных возможностей языка С++. Надеюсь со временем вы тоже сможете создавать АТД, которыми можно будет пользоваться так же удобно и свободно, как и классом string.
Строковый тип данных позволяет хранить строки переменной длины, причем длину можно менять в процессе выполнения программы. Строковый тип представляет операторы, выполняющие такие операции над строками, как контеканация, присваивание, замещение и др.
Для того, чтобы можно было создавать строковую переменную, необходимо подключить описание этого типа данных из стандартной библиотеки.
#include <iostream>
#include <string>
using namespaсe std;
void main()
{
string name="Vitaly"; // объявление, определение, инициализация
string lastname="Domnenko";
name+="M."+lastname; // конкатенация с присваиванием (накапливающее присваивание)
cout<<"My name is "<<name<<endl; // вывод
}
Используя [ ] можно получить символ из любой позиции
char ch=name[5]; // символы нумеруются с нуля
Лексикографическое сравнение осуществляется с использованием операторов == < <= > >=!=. При лексикографическом сравнении последовательно сравниваются коды символов строки. Те символы считаются "больше", чьи коды "больше"и наоборот.
Кодировка (кодовая таблица) - это однозначное соответствие между целым число (кодом) и символом. При этом символ - это буква, цифра и другие графические знаки. Кодировки обычно составляют так, что символы следуют в алфавитном порядке и символ 'а' имеет наименьший код, а символ 'z' наибольший. Таким образом, выполняя лексикографическое сравнение можно разместить слова (строки) в алфавитном порядке. Это справедливо и для символов кириллического алфавита. Но не всегда, т.к. существует кодировки, в которой кириллические символы располагаются не в алфавитном порядке. Это кодировка КОИ8, которая обычно используется в операционных системах UNIX. Если вы пишете программу для UNIX, то нужно помнить, что простое лексикографическое сравнение не даст ожидаемого результата и нужно усложнять программу.
В нашем случае (при программировании для DOS или Windows) используются кодировки CP866 и СP1251 лексикографическое сравнение справедливо и дает нужный результат.
Ну и операторы для ввода/вывода строковых переменных >> << работают также как и для переменных других типов.
Функция | Описание |
Конструкторы | |
string() | конструктор по умолчанию, создает пустую строку |
string(const char* p) | преобразующий конструктор |
string(const string& str, size t pos=0, size t n=npos) | копирующий конструктор (npos обычно равен -1 и указывает, что память не была выделена) |
string(const char* p, size_t n) | копирует n символов, р является базовым адресом |
string(char c, size t n=l) | создает строку из n символов с |
Перегруженные операторы | |
string& operator= (const string& s) | оператор присваивания |
string& operator+= (const string& s) | добавляет строку |
char operator[] (size t pos) const | возвращает символ из позиции pos |
char& operator[] (size t pos) | возвращает ссылку на символ из позиции pos |
Функции-члены | |
string& append(const string& s, size_t pos=0, size t n=npos); | Добавляет n символов начиная от позиции pos |
string& assign(const string& s, size_t pos=0, size_t n=npos); | строковому объекту присваивается n символов, начиная от позиции pos |
string& insert(size_t posl, const string& str, size_t pos2=0, size_t n=npos); | вставляет n символов, полученных из str, начиная с позиции pos2, в строку с позиции posl |
string& remove(size_t pos=0, size_t n=npos); | Удаляются n символов из строки начиная с позиции pos |
string& replace(posl, nl, str, pos2=0, n2=npos); | в неявной строке начиная с позиции posl заменяет nl символов n2 символами из подстроки str с позиции pos2 |
string& replace(pos, n, p, n2); | заменяет n символов в позиции pos используя char* p из n2 символов или char* p до завершающего нуля, или повторяя символ с rep раз |
char get_at (pos) const; | возвращает символ из позиции pos |
void put_at (pos, c); | помещает символ с в позицию pos |
size_t length() const; | возвращает длину строки |
const char* c_str() const; | преобразует строку в традиционное char* представление |
const char* data() const; | возвращает базовый адрес строкового представления |
void resize(n, c); void resize(n); | изменяет строку, делая ее длину равной п; в первой функции в качестве заполняющего символа выступает с, а во второй - символ eos () (end-of-string, конец строки) |
void reserve(size_t res_arg);size_t reserve() const; | выделяет память под строку; первая функция переустанавливает this; вторая возвращает закрытый член res - размер выделенного фрагмента |
size_t copy(p, n, pos=0) const; | п симолов строки, начиная с позиции pos, копируются в char* p |
string substr(pos=0, n=pos) const; | возвращается подстрока из п символов строки |
int compare(const string& str, size_t pos=0, size_t n=npos) const; | сравнивает п символов строки, начиная с позиции pos, со строкой str. Возвращается ноль, если строки равны; в противном случае возвращается положительное или отрицательное целое значение, показывающее, что неявная строка лексикографически больше или меньше чем строка str. |
size_t find (const string& str, size_t pos=0) const; | в строке начиная с позиции pos производится поиск строки str. Если она найдена, возвращается позиция, в которой она начинается; в противном случае возвращается позиция npos |
size_t rfind(str, pos=npos) const; | похоже на find (), но при поиске первого совпадения строка сканируется в обратном направлении |
size_t find_first_of(str, pos=0) const; | производится поиск первого вхождения str начиная с позиции pos |
size_t find_last_of(str, pos=npos) const; | аналогично, но в обратном направлении |
size_t find_first_not_of(str, pos=0) const; | производится поиск первого символа, который не соответствует ни одному из символов str начиная с позиции pos |
size_t find_last_not_of(str, pos=npos) const; | аналогично, но в обратном направлении |