Строковые переменные и константы

Файловые потоки

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

#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 лексикографическое сравнение справедливо и дает нужный результат.

Ну и операторы для ввода/вывода строковых переменных >> << работают также как и для переменных других типов.