Шаг 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. Они, естественно, не выводятся на экран, а обеспечивают табуляцию и смену строки.

    На следующем шаге мы рассмотрим безымянные входные строковые потоки.




Предыдущий шаг Содержание Следующий шаг