На этом шаге мы рассмотрим организацию и использование входных строковых потоков.
Входные строковые потоки создаются с помощью такого конструктора класса istrstream:
istrstream имя_потока(char *str);
Обязательным параметром конструктора объектов класса istrstream является указатель str на уже существующий участок основной памяти.
Например, следующие операторы
char buf[40];
istrstream inBuf(buf);
определят входной строковый поток с именем inBuf и свяжут его с участком памяти, предварительно выделенным для символьного массива buf[]. Теперь этот строковый поток inBuf может использоватья как левый операнд операции извлечения >>.
//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
//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. Они, естественно, не выводятся на экран, а обеспечивают табуляцию и смену строки.
На следующем шаге мы рассмотрим безымянные входные строковые потоки.