【问题标题】:How to print an entire istream to standard out and string如何将整个 istream 打印到标准输出和字符串
【发布时间】:2010-10-15 03:02:48
【问题描述】:

如何将 istream 变量打印到标准输出。 [编辑] 我正在尝试调试一个需要将 istream 输出到日志文件的场景

【问题讨论】:

  • 请说明您要做什么。
  • 我想打印出整个字符串

标签: c++ stream


【解决方案1】:

您输出 istream 的 streambuf。

例如,输出一个 ifstream 到 cout:

std::ifstream f("whatever");
std::cout << f.rdbuf();

【讨论】:

    【解决方案2】:

    编辑: 我假设您要复制流的全部内容,而不仅仅是一个值。如果您只想阅读一个单词,请改为查看 1800 的答案。


    显而易见的解决方案是一次复制一个单词的 while 循环,但您可以更简单地使用它,作为一个不错的 oneliner:

    #include <iostream>
    #include <iterator>
    
    ...
    
    std::istream i;
    std::copy(std::istream_iterator<char>(i), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));
    

    stream_iterator 在内部使用运算符 >,这意味着它们将忽略空格。如果你想要一个精确的副本,你可以使用 std::istreambuf_iterator 和 std::ostreambuf_iterator 代替。它们在底层(未格式化)流缓冲区上工作,因此它们不会跳过空格或转换换行符或任何东西。

    你也可以使用:

     i >> std::noskipws;
    

    防止空白消失。但是请注意,如果您的流是二进制文件,则&gt;&gt;&lt;&lt; 运算符可能会破坏其他一些字符。

    【讨论】:

      【解决方案3】:

      这将打印整个流,一次 1 个字符:

      char c;
      c = my_istream.get();
      while (my_istream)
      {
          std::cout << c;
          c = my_istream.get();
      }
      

      这将打印整个内容,但丢弃空格:

      std::string output;
      while(my_istream >> output)
          std::cout << output;
      

      【讨论】:

        【解决方案4】:

        你需要从中读取,然后输出你读取的内容:

        istream stm;
        string str;
        stm >> str;
        cout << str;
        

        【讨论】:

        • 只读取一个单词(空格分隔)。我认为他想从流中复制所有内容。
        • 我想如果他愿意的话,他会说出来的
        • 谁知道自己想要什么,问题很穷。
        【解决方案5】:

        std::ifsream 重载和 std::ostringstream

        c++11 或更高版本


        注意std::ifstream中的&amp;&amp;,让你直接使用

        #include <iostream>
        #include <sstream>
        #include <fstream>
        
        std::ostream& operator<<(std::ostream& os, std::basic_ostringstream&& iss){
            return os<<iss.str();
        }
        
        std::ostream& operator<<(std::ostream& os, std::ifstream&& ifs){
            return std::cout<<ifs.rdbuf();
        }
        
        
        int main()
        {
            std::cout<<std::ostringstream("Test ostringstream overloading")<<std::endl;
            std::ofstream("fstream.txt")<<"Test fstream overloading"<<std::endl;
            std::cout<<std::ifstream("fstream.txt")<<std::endl; // overloading okay
        }
        

        输出:

        Test ostringstream overloading
        Test fstream overloading
        
        
        Process returned 0 (0x0)   execution time : 0.012 s
        Press ENTER to continue.
        

        【讨论】:

        • basic_ostringstream 是一个依赖于模板的函数。第一个函数应转换为“template std::ostream& operator&& iss){ return os
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 2018-07-02
        相关资源
        最近更新 更多