1

main()の実行の最後に、stdoutに(からstd::cout)送信された最後の文字が'\n'(またはプラットフォーム固有の行末)であったかどうかを確認する必要があります。これをテストする方法は?Cスタイルのio(printfなど)は使用されていないと想定しても問題ありません。

プログラムはC++用のREPLです。C ++式(またはステートメント)を評価し、結果をstdoutに出力します。出力は常に単一の改行で終了することが望ましいです。

4

2 に答える 2

3

に出力する代わりにcout、標準の演算子/関数を受け入れる独自のストリームのようなオブジェクトを定義できますostreamが、操作を実際のに渡すときに、最後に印刷された文字を追跡しcoutます。

于 2012-08-21T18:28:41.637 に答える
3

@Kevinによって与えられたこれと同様の答えです。しかし、私はそれがあなたのニーズにとってより良いと信じています。coutの代わりにストリームを使用する代わりに、std::coutのstreambufを独自のストリームに置き換えることができます。

int main() {
   std::streambuf* cbuf = std::cout.rdbuf(); // back up cout's streambuf
   std::cout.flush();
   keep_last_char_outbuf keep_last_buf(cbuf);
   std::cout.rdbuf(&keep_last_buf);          // assign your streambuf to cout

   std::cout << "ala ma kota\n";

   char last_char = keep_last_buf.get_last_char();
   if (last_char == '\r' || last_char == '\n')
      std::cout << "\nLast char was newline: " << int(last_char) << "\n";
   else
      std::cout << "\nLast char: '" << last_char << "'\n";

   std::cout << "ala ma kota";
   last_char = keep_last_buf.get_last_char();
   if (last_char == '\r' || last_char == '\n')
      std::cout << "\nLast char was newline: " << int(last_char) << "\n";
   else
      std::cout << "\nLast char: '" << last_char << "'\n";

   std::cout.rdbuf(cbuf); // restore cout's original streambuf
}

そして期待される出力:

ala ma kota

Last char was newline: 10
ala ma kota
Last char: 'a'

そのようなものを書く作業は非常に簡単ではありません。デコレータパターンとstreambufインターフェイスclass keep_last_char_outbufを探してください。

これで遊ぶ時間がない場合は、私の提案ideoneリンクを見てください

class keep_last_char_outbuf : public std::streambuf {
public:
    keep_last_char_outbuf(std::streambuf* buf) : buf(buf), last_char(traits_type::eof()) {
        // no buffering, overflow on every char
        setp(0, 0);
    }
    char get_last_char() const { return last_char; }

    virtual int_type overflow(int_type c) {
        buf->sputc(c);
        last_char = c;
        return c;
    }
private:
    std::streambuf* buf;
    char last_char;
};
于 2012-08-21T18:42:10.193 に答える