2016-10-11 1 views
-3

Для определенной программы у меня есть две функции, которые принимают входной и выходной поток, выполняя некоторую операцию на входе и записи на выходе. Я могу назвать их так:Как создавать потоковые операции на C++?

a(cin, cout); 
b(cin, cout); 

Скажем, я хочу, чтобы запустить их в последовательности, так что обе операции от а и б применяются. В настоящее время я использую stringstream в качестве промежуточного iostream для хранения результата, например, так:

stringstream buffer; 
a(cin, buffer); 
b(buffer, cout); 

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

Есть ли (стандартная) техника, которую я могу использовать для объединения этих операций, желательно без изменения a и b слишком много? Кроме того, если это возможно, я бы хотел избежать повышения.

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

+0

Вы говорите, что вы хотите сделать что-то похожее на StD :: Endl (который на самом деле функция)? – UKMonkey

+0

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

+0

@UKMonkey Я не уверен, как это сработает, но если это поможет мне создать функциональность, эквивалентную моей второй выборке кода, да. –

ответ

0

Есть ли (стандартная) техника, которую я могу использовать для объединения этих операций, желательно, не меняя а и b? Кроме того, если это возможно, я бы хотел избежать повышения.

Что вы действительно хотите - это своего рода идиома производителя/потребителя, где производитель читает IN, а потребитель пишет OUT. Насколько мне известно, ничто в родном C++ не поможет, хотя Boost поддерживает сопрограммы, которые (насколько мне известно), в основном, что вы в конечном итоге получите.

Здесь вы можете реализовать свою программу, которая может позволить вам внести минимальные изменения в a и b. В этом случае я предполагаю, что вы читаете текстовый файл с разделителями строк. Если вы читаете двоичные файлы, вы хотите, чтобы прочитать фиксированное количество байтов, а не строки.)

std::stringstream buffer; 
std::string line; 
while (std::getline(std::cin, line)) 
{ 
    std::istringstream iss(line); 
    a(iss, buffer); 
    b(buffer, std::cout); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^