2015-08-11 1 views
1

Предположим, у вас есть две строки, и вы хотите знать, является ли это префиксом другого. Вот один из способов сделать это в C++:Идиоматический способ узнать, если istream начинается со строки на C++?

std::string s = ...; 
std::string prefix = ...; 
bool sStartsWithPrefix = std::equal(prefix.begin(), prefix.end(), s.begin()); 

Но предположим, что вместо s у вас есть входной поток:

std::istream& inputStream = ...; 
std::string prefix = ...; 
bool inputStreamStartsWithPrefix = ? 

Конечно, мы могли бы вычислить inputStreamStartsWithPrefix написав для цикла. Но как это сделать идиоматично (без цикла for, с алгоритмом)?

+0

'istream :: get'? –

ответ

5

Вы можете использовать std::istream_iterator в сочетании с std::equal как

std::istringstream is("foobar"); 
std::string prefix = "foo"; 
bool inputStreamStartsWithPrefix = std::equal(prefix.begin(), prefix.end(), std::istream_iterator<char>(is)); 
0

Вы собираетесь должны прочитать из потока в любом случае, так что вы, вероятно, лучше просто чтение из потока, а затем проверка содержимое того, что вы только что прочитали, чтобы увидеть, начинается ли оно с строки.

Попытка сделать что-либо еще сделает очень трудным делать то, что вы намереваетесь делать, когда поток не начинается с этой строки. (если, конечно, если ваше намерение - это что-то вроде выхода из программы)

+0

Если эти потоки не настолько велики, что они не вписываются в память. , , –

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