#include sstream

Например, следующая функция читает весь файл alice_emma в объект buf класса ostringstream. Размер buf увеличивается по мере необходимости, чтобы вместить все символы: #include string #include fstream #include sstream string read_file_into_string() { ifstream ifile( "alice_emma" ); ostringstream buf; char ch; while ( buf && ifile.get( ch )) buf.put( ch ); return buf.str(); }

Функция-член str() возвращает строку – объект класса string, ассоциированный со строковым потоком ostringstream. Этой строкой можно манипулировать так же, как и “обычным” объектом класса string. Например, в следующей программе text почленно инициализируется строкой, ассоциированной с buf:

int main()

{

string text = read_file_into_string();

// запомнить позиции каждого символа новой строки

vector string::size_type lines_of_text;

string::size_type pos = 0;

while ( pos != string::npos )

{

pos = text.find( '\n' pos );

lines_of_text.push_back( pos );

}

// ...

}

Объект класса ostringstream можно использовать для автоматического форматирования составной строки, т.е. строки, составленной из данных разных типов. Так, следующий оператор вывода автоматически преобразует любой арифметический тип в соответствующее строковое представление, поэтому заботиться о выделении нужного количества памяти нет необходимости:

#include iostream

#include sstream

int main()

{

int ival = 1024; int *pival =

double dval = 3.14159; double *pdval =

ostringstream format_message;

// преобразование значений в строковое представление

format_message "ival: " ival

" адрес ival: " pival 'n'

"dval: " dval

" адрес dval: " pdval endl;

string msg = format_message.str();

cout " размер строки сообщения: " msg.size()

" сообщение:"msg endl;

}

Иногда лучше собрать все диагностические сообщения об ошибках, а не выводить их по мере возникновения. Это легко сделать с помощью перегруженного множества функций форматирования:

string

format( string msg, int expected, int received )

{

ostringstream message;

message msg " ожидалось: " expected

" принято: " received "\n";

return message.str();

}

string format( string msg, vectorint *values );

// ... и так далее

Приложение может сохранить такие строки для последующего отображения и даже рассортировать их по серьезности. Обобщить эту идею помогают классы Notify (извещение), Log (протокол) и Error (ошибка).

Поток istringstream читает из объекта класса string, с помощью которого был сконструирован. В частности, он применяется для преобразования строкового представления числа в его арифметическое значение:

#include iostream

#include sstream

#include string

int main()

{

int ival = 1024; int *pival =

double dval = 3.14159; double *pdval =

// создает строку, в которой значения разделены пробелами

ostringstream format_string;

format_string ival " " pival " "

dval " " pdval endl;

// извлекает сохраненные значения в коде ASCII

// и помещает их в четыре разных объекта

istringstream input_istring( format_string.str() );

input_istring ival pival

dval pdval;

}

Упражнение 20.16

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

int ival = 1024;

double dval = 3.14159;

char cval = 'a';

char *sval = "the end";

printf( "ival: %d\tdval% %g\tcval: %c\tsval: %s",

ival, dval, cval, sval );

печатает:

ival: 1024 dval: 3.14159 cval: a sval: the end

Перейти на страницу:

Похожие книги