Что-то вроде istream :: getline (), но с альтернативными символами-разделителями?

Какой самый чистый способ получить эффект istream::getline(string, 256, '\n' OR ';')?

Я знаю, что написать цикл довольно просто, но я чувствую, что могу что-то упустить. Я?

Что я использовал:

while ((is.peek() != '\n') && (is.peek() != ';'))
stringstream.put(is.get());

5

Решение

К сожалению, нет способа иметь несколько «окончаний строк». Что вы можете сделать, это прочитать строку, например, std::getline и положить его в std::istringstream и использовать std::getline';' разделитель) в цикле на istringstream,

Хотя вы могли бы проверить Повышение Iostreams библиотека, чтобы видеть это, у этого есть функциональность для этого.

3

Другие решения

Там в станд :: GetLine.
Для более сложных сценариев можно попробовать разделить istream_iterator или же istreambuf_iterator с буст сплит или же regex_iterator (вот пример использования потоковых итераторов).

3

Вот рабочая реализация:

enum class cascade { yes, no };
std::istream& getline(std::istream& stream, std::string& line, const std::string& delim, cascade c = cascade::yes){
line.clear();
std::string::value_type ch;
bool stream_altered = false;
while(stream.get(ch) && (stream_altered = true)){
if(delim.find(ch) == std::string::npos)
line += ch;
else if(c == cascade::yes && line.empty())
continue;
else break;
}
if(stream.eof() && stream_altered) stream.clear(std::ios_base::eofbit);
return stream;
}

cascade::yes Опция свертывания найденных последовательных разделителей. С cascade::no, он будет возвращать пустую строку для каждого второго найденного последовательного разделителя.

Использование:

const std::string punctuation = ",.';:?";
std::string words;
while(getline(istream_object, words, punctuation))
std::cout << word << std::endl;

Смотрите его использование Жить на Колиру

Более общая версия будет этот

0
По вопросам рекламы [email protected]