Đây là một thực hiện làm việc:
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;
}
Tùy chọn cascade::yes
sụp đổ delimiters liên tiếp được tìm thấy. Với cascade::no
, nó sẽ trả về một chuỗi rỗng cho mỗi một dấu phân cách liên tiếp thứ hai được tìm thấy.
Cách sử dụng:
const std::string punctuation = ",.';:?";
std::string words;
while(getline(istream_object, words, punctuation))
std::cout << word << std::endl;
Xem sử dụng của nó Live on Coliru
Một phiên bản chung chung hơn sẽ this
Ok, cảm ơn, điều đó khá tuyệt! Tôi đã viết một vòng lặp rằng std :: stringstream.put(): ed mọi char cho đến khi nó tìm thấy '\ n' hoặc ';', và sau đó được sử dụng stringstream.str() để lấy chuỗi. – Erika