Шаг 13.
Входные строковые потоки
На этом шаге мы рассмотрим организацию и использование входных строковых потоков.
Входные строковые потоки создаются с помощью такого конструктора класса istrstream:
istrstream имя_потока(char *str);
Обязательным параметром конструктора объектов класса istrstream является указатель str на уже существующий участок основной памяти.
Например, следующие операторы
char buf[40];
istrstream inBuf(buf);
определят входной строковый поток с именем inBuf и свяжут его с участком памяти, предварительно выделенным для символьного
массива buf[]. Теперь этот строковый поток inBuf может использоватья как левый операнд операции
извлечения >>.
Пример 1. В следующей программе определена строка, содержащая символьную информацию
"123.5 Salve!", затем определен
и связан с этой строкой входной строковый поток
instr. Из потока
instr и тем самым из строки, адресуемой указателем
stroka, разделенные пробелами значения переносятся в переменную
real типа
double и символьный массив
array[10]. Текст программы:
//OOP13_1.СРР - строковые потоки, операция извлечения >>.
//Автоматически включается файл iostream.h:
#include <strstrea.h>
void main ()
{
// Выделена область памяти (строка):
char *stroka = "123.5 Salve!";
// Создан входной строковый поток instr:
istrstream instr(stroka);
char array [10] ;
double real;
// Извлекаем информацию из строкового потока:
instr >> real >> array;
// Вывод на экран:
cout << "\narray = " << array << " real = " << real << endl;
}
Текст этой программы можно взять
здесь.
Результат выполнения программы:
array = Salve! real = 123.5
Пример 2. В следующей программе с помощью входного строкового потока выполняется чтение информации, передаваемой
в качестве параметра командной строки функции
main:
//OOР13_2.СРР - входной строковый поток; чтение аргумента функции main().
//Автоматически включается файл iostream.h:
#include <strstrea.h>
void main(int argc, char *argv[]) // Определены аргументы.
{
char name[40]; // Выделяется область памяти.
// Создает строковый поток input:
istrstream input(argv[1]);
// Извлекаем информацию из строкового потока:
input >> name;
// Вывод в стандартный поток (на экран):
cout << "\nПри вызове аргумент = " << name << endl;
}
Текст этой программы можно взять
здесь.
Если программа будет запущена на выполнение командой:
C:\>OOР13_2.БХЕ Filename <Enter>
то на экране появится сообщение:
При вызове аргумент = FileName
Извлечение информации из строкового потока с помощью операции >> выполняется, начиная от первого
непробельного символ до ближайшего пробела. Если необходимо читать и пробельные символы, то можно воспользоваться
функциями бесформатного обмена get() и getline(). Эти функции, вызываемые для символьных потоков,
позволяют организовать, например, копирование строк. Для копирования строк в библиотеке языка С существует специальная
функция strcpy(), определенная в заголовочном файле string.h. Копирование несложно организовать и с
помощью циклического переноса символов из одного массива в другой. Однако интересный вариант копирования получается
при использовании строковых потоков. Например, в следующей программе выполняется "копирование" содержимого строки,
адресуемой указателем line, в заранее созданный символьный массив array[]. В соответствии с форматом
функции getline() ее первый параметр - массив, в который ведется чтение, второй параметр - предельное количество
читаемых символов, третий параметр - ограничивающий символ, после извлечения которого обмен прекращается. Функция
getline() вызывается для чтения из потока inpotok, связанного со строкой line. Текст программы:
//OOР13_3.СРР - копирование строки функцией getline().
#include <strstrea.h>
void main()
{
char *line = "000 111 \t222\n333\t444 555";
istrstream inpotok(line);
char array[80];
inpotok.getline(array,sizeof(array),'\0');
cout << "\narray = " << array << endl;
}
Текст этой программы можно взять
здесь.
Результат выполнения программы:
array = 000 111 222
333 444 555
В результатах выполнения обратите внимание на влияние символов '\t', '\n', присутствующих как в исходной строке
line, так и перенесенных в символьный массив array. Они, естественно, не выводятся на экран, а обеспечивают
табуляцию и смену строки.
На следующем шаге мы рассмотрим безымянные входные строковые потоки.
Предыдущий шаг
Содержание
Следующий шаг