で文字列バッファを正しくss.str("")
空にしましたが、ストリームのエラー状態を でクリアする必要もあります。ss.clear()
そうしないと、最初の抽出後にそれ以上読み取りが試行されなくなり、EOF 状態が発生します。
そう:
string whatTime(int seconds) {
string h,m,s,ans;
stringstream ss;
ss << (seconds/3600);
seconds -= (3600*(seconds/3600));
ss >> h;
ss.str("");
ss.clear();
ss << (seconds/60);
seconds -= (60*(seconds/60));
ss >> m;
ss.str("");
ss.clear();
ss << seconds;
ss >> s;
return (h + ":" + m + ":" + s );
}
ただし、これが完全なコードであり、何らかの理由で個々の変数が必要ない場合は、次のようにします。
std::string whatTime(const int seconds_n)
{
std::stringstream ss;
const int hours = seconds_n / 3600;
const int minutes = (seconds_n / 60) % 60;
const int seconds = seconds_n % 60;
ss << std::setfill('0');
ss << std::setw(2) << hours << ':'
<< std::setw(2) << minutes << ':'
<< std::setw(2) << seconds;
return ss.str();
}
それははるかに簡単です。ここで動作することを確認してください。
C++11 では、 を使用してストリームを完全に回避std::to_string
できますが、ゼロ パディングはできません。