На этом шаге мы рассмотрим создание и использование безымянных строковых потоков.
Конструктор класса 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 и служит признаком конца созданной строки.
На следующем шаге мы рассмотрим выходные строковые потоки.