std::getlineで文字区切り

以下はstd::getlineにstd::stringstreamを渡した場合と、std::cinを渡した場合です。

#include <iostream>
#include <sstream>

template<class Istr>
void show_separated_str(Istr& istr, char delim){
    std::string str;
    while(std::getline(istr, str, delim)){
        std::cout << str << std::endl;
    }
}

int main(){
    std::string animals = "cat/dog/c++/rabbit";
    std::stringstream ss(animals);

    char delim = '/';
    std::cout << "stringstream:" << std::endl;
    show_separated_str(ss, delim);

    std::cout << std::endl;

    std::cout << "cin:" << std::endl;
    show_separated_str(std::cin, delim);
    
    return 0;
}

Input:

fine/good/bad

Output:

stringstream:
cat
dog
c++
rabbit

cin:
fine
good


stringstreamの文字列は末尾まで読んでくれたのですが、標準入力は最後の区切り文字から後を読んでくれませんでした。
stringstreamとcinとで仕様がそれぞれ違うんでしょうか。

標準入力文字列を文字区切りしたいときはいったん全部std::stringに読んでからstringstreamに渡して…というのがよさそうですね。

#include <iostream>
#include <sstream>

int main(){
    std::string in_str;
    std::getline(std::cin, in_str);

    std::stringstream ss(in_str);
    char delim = '-';
    std::string str;
    while(std::getline(ss, str, delim)){
        std::cout << str << std::endl;
    };
    
    return 0;
}

Input:

one-two-three

Output:

one
two
three