Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 正在获取发送到std::cout的最后一个字符_C++_Iostream_Cout - Fatal编程技术网

C++ 正在获取发送到std::cout的最后一个字符

C++ 正在获取发送到std::cout的最后一个字符,c++,iostream,cout,C++,Iostream,Cout,我需要在主执行结束时检查通过std::cout发送到stdout的最后一个字符是“\n”还是特定于平台的行尾。如何对此进行测试?可以安全地假设没有使用类似printf的C风格io 程序是C++的RePL。它评估C++表达式或语句,并在STDUT上打印结果。希望输出总是以一行新行结束。而不是打印到cout,您可以定义自己的流式对象,该对象接受标准的ostream运算符/函数,但在将操作传递到真实cout时跟踪最近打印的字符。而不是打印到cout,您可以定义自己的类流对象,该对象接受标准的ostre

我需要在主执行结束时检查通过std::cout发送到stdout的最后一个字符是“\n”还是特定于平台的行尾。如何对此进行测试?可以安全地假设没有使用类似printf的C风格io


程序是C++的RePL。它评估C++表达式或语句,并在STDUT上打印结果。希望输出总是以一行新行结束。

而不是打印到cout,您可以定义自己的流式对象,该对象接受标准的ostream运算符/函数,但在将操作传递到真实cout时跟踪最近打印的字符。

而不是打印到cout,您可以定义自己的类流对象,该对象接受标准的ostream运算符/函数,但在将操作传递到真实cout时跟踪最近打印的字符。

这与@Kevin给出的答案类似。不过,我相信它更适合您的需要。您可以将std::cout中的streambuf替换为您自己的,而不是使用您的流来代替cout:

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
}
编写此类类keep_last_char_extuf的任务并不容易,请查找装饰器模式和接口

如果你没有时间玩这个-看看我的建议


这与@Kevin给出的答案类似。不过,我相信它更适合您的需要。您可以将std::cout中的streambuf替换为您自己的,而不是使用您的流来代替cout:

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
}
编写此类类keep_last_char_extuf的任务并不容易,请查找装饰器模式和接口

如果你没有时间玩这个-看看我的建议


为什么?你想做什么?通常最好是询问问题,而不是步骤,而是std::cin.get应该起作用。last是最后一个还是最近一个?@Lol4t0:cos是C输出流!哎呀,我的坏朋友误解了我的意图。在这种情况下,也许只是将stdout重定向到一个stringstream并在那里操作缓冲区?为什么?你想做什么?通常最好是询问问题,而不是步骤,而是std::cin.get应该起作用。last是最后一个还是最近一个?@Lol4t0:cos是C输出流!哎呀,我的坏朋友误解了我的意图。在这种情况下,也许只是将stdout重定向到stringstream并在那里操作缓冲区?这正是我所需要的!非常感谢。这将纳入project@Leonid-很高兴知道这一点。请记住两件事,在我的解决方案中我并不关心:1多线程2通过cout.rdbuf->pubstebuf设置外部缓冲区。。。设置keep_last_char_Expauf后,这正是我需要的!非常感谢。这将纳入project@Leonid-很高兴知道这一点。请记住两件事,在我的解决方案中我并不关心:1多线程2通过cout.rdbuf->pubstebuf设置外部缓冲区。。。设置“保持最后字符”后。
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;
};