Шаг 14.
Безымянные входные строковые потоки

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

    Конструктор класса istrstream позволяет создавать и связывать с заданной областью памяти безымянные входные строковые потоки. Например, чтение информации, переданной при запуске функции main() в командной строке, обеспечит следующая программа:

//OOР14_1.СРР  -  безымянный входной  строковый поток;   чтение
//	данных  с помощью операции извлечения >>.
#include <strstrea.h>
void main(int Narg, char *arg[])
{
  char path [80] ;
  // Чтение из  безымянного потока:
  istrstream(arg[0])  >> path;
  cout <<  "\nПолное имя программы: \n"  << path <<  endl;
}
Текст этой программы можно взять здесь.

    Результат выполнения программы, например, такой:

    Полное имя программы: D:\WWP\TESTPROG\OOP14_1.EXE

    По соглашениям языка и операционной системы arg[0] всегда содержит полное наименование программы с указанием диска и полного пути к каталогу, где находится ЕХЕ-файл. Вызов конструктора istrstream(arg[0]) создает безымянный объект - входной строковый поток, связанный с символьным массивом, адрес которого передается как значение указателя arg[0]. К этому потоку применима операция извлечения >>, с помощью которой полное наименование программы переносится в виде строки из arg[0] в символьный массив path[].

    В следующей программе с одним и тем же участком памяти (строка, адресуемая указателем line) последовательно связываются три безымянных входных строковых потока.

//OOР14_2.СРР  - чтение из  безымянных строковых потоков.
#include <strstrea.h>
void main ()
{ 
  char *line = "000  111  \t222\n333\t444  555";
  char array[80]; // Вспомогательный массив/
  // Чтение из безымянного потока до пробела:
  istrstream (line) >> array;
  cout << " \narray = " << array << endl ;
  //Повторное чтение из безымянного потока:
  istrstream(line) >> array;
  cout << "\narray = " << array << endl;
  // Вызов функции getline() для безымянного потока:
  istrstream(line).getline(array,sizeof(array) , '\0'); 
  cout << "array = " << array << endl;
}
Текст этой программы можно взять здесь.

    Результат выполнения программы:

    array =  000	

    array =  000
    array =  000      111          222
    333      444      555

    Из первого безымянного потока данные в массив array извлекаются (до первого пробела) операцией >>. Второй безымянный поток связан с той же строкой. Из него в массив array снова с начала строки читается та же самая информация. Третий безымянный поток читается с помощью функции getline(), которая полностью копирует строку line в символьный массив array[]. Извлечение данных функцией getline() продолжается до появления нулевого признака конца строки '\0'. Этот символ также переносится в массив array и служит признаком конца созданной строки.

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




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