Входные строковые потоки

   
На этом шаге мы рассмотрим организацию и использование входных строковых потоков.

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий