精华内容
下载资源
问答
  • 最近在看C++ STL的源码,看的主要是gnu2.9版本的源码。 其中看到了istream_iterator的实现源码,源码如下: template <class T, class Distance = ptrdiff_t> class istream_iterator { friend bool ...

    最近在看C++ STL的源码,看的主要是gnu2.9版本的源码。

    其中看到了istream_iterator的实现源码,源码如下:

    template <class T, class Distance = ptrdiff_t> 
    class istream_iterator {
      friend bool
      operator== __STL_NULL_TMPL_ARGS (const istream_iterator<T, Distance>& x,
                                       const istream_iterator<T, Distance>& y);
    protected:
      istream* stream;
      T value;
      bool end_marker;
      void read() {//根据*stream来确定end_marker
        end_marker = (*stream) ? true : false;
        if (end_marker) *stream >> value;
        end_marker = (*stream) ? true : false;
      }
    public:
      typedef input_iterator_tag iterator_category;
      typedef T                  value_type;
      typedef Distance           difference_type;
      typedef const T*           pointer;
      typedef const T&           reference;
    
      istream_iterator() : stream(&cin), end_marker(false) {}
      istream_iterator(istream& s) : stream(&s) { read(); }
      reference operator*() const { return value; }
    #ifndef __SGI_STL_NO_ARROW_OPERATOR
      pointer operator->() const { return &(operator*()); }
    #endif /* __SGI_STL_NO_ARROW_OPERATOR */
      istream_iterator<T, Distance>& operator++() { 
        read(); 
        return *this;
      }
      istream_iterator<T, Distance> operator++(int)  {
        istream_iterator<T, Distance> tmp = *this;
        read();
        return tmp;
      }
    };

    istream_iterator的源码并不复杂,遇到的问题主要是在于vs studio中的使用上。先放上,我的代码:

    #include <iostream>
    #include <iterator>
    #include <vector>
    
    int main()
    {
    	std::cout << "请输入vector的初始化元素值:";
    	std::istream_iterator<double> eos; //终止符 end of stream
    	std::istream_iterator<double> itt(std::cin);
    	std::vector<double> vec;
    	while (itt!=eos)
    	{
    		vec.push_back(*itt);
    		itt++;
    	}
    	std::cout << "value: ";
    	for (auto a : vec)
    	{
    		std::cout << a << " ";
    	}
    	std::cout << std::endl;
    	return 0;
    }
    

    可以看到在使用istream_iterator的时候,我们需要将其绑定std::cin以及还需要额外定义一个没有赋初值的'eos'。

    那么恰恰问题就出在这里,EOS在Windows上的值到底是啥?是空格、回车还是另有其值?

    最后发现,终止符的输入方法为Ctrl+Z

    在我们输入完元素后,我们输入Ctrl+Z后,再需要输入换行符(),才能使得istream_iterator识别到终止符,从而终止输入。

    输入效果如下:

    这算是一个小小的坑,记录一下!马上也要完成STL的源码阅读了,也算是留作纪念了吧!

    展开全文
  • C++ istream_iterator

    2017-06-21 15:05:01
    上面讲解了istream_iterator的基本原理, 很神奇. 我写了使用流迭代器读写用户自定义类到文件的实例代码 #include #include #include using namespace std ; class Foo { friend istream& ...

    From: https://stackoverflow.com/questions/16727125/how-does-stdcopy-work-with-stream-iterators

    First, note that in this case, there’s no real need to use std::copy at all. You can just initialize the vector directly from the iterators:

    vector<string> col((istream_iterator<string>(cin)),
                        istream_iterator<string>());

    This probably doesn’t make the code a whole lot easier to understand though.

    As far as how the code works, it’s probably a little more straighforward than you think. An istream_iterator looks vaguely like this:

    template <class T>
    class istream_iterator { 
        std::istream *is;
        T data;
    public:
        istream_iterator(std::istream &is) : is(&is) { ++(*this); }
        istream_iterator() : is(nullptr) {}
    
        T operator++() { (*is) >> data; return *this; }
        T operator++(int) { (*is) >> data; return *this; }
    
        T const &operator*() { return data; }   
    
        bool operator !=(istream_iterator &end) { return (*is).good(); }
        bool operator ==(istream_iterator &end) { return !(*is).good(); }
    };

    Obviously there’s more more I’m skipping over, but that’s most of what we care about here. So, what happens is that when you create the iterator, it reads (or attempts to) an item from the stream into the variable I’ve called data. When you dereference the iterator, it returns data. When you increment the iterator, it reads (or attempts to) the next item from the file. Despite being written as if they compare one iterator to another, operator== and operator!= really just check for the end of the file1.

    That’s then used by std::copy, which (again simplified) looks vaguely like this:

    template <class InIt, class OutIt>
    void std::copy(InIt b, InIt e, OutIt d) { 
        while (b != e) {
            *d = *b;
            ++b;
            ++d;
        }
    }

    So, this reads and item from the input iterator, writes that item to the output iterator, and repeats until the iterator for the current position compares equal to the iterator for the end of the input (which will happen when you reach the end of the file). Note that unlike other iterators, the only “end” position you’re allowed to use with an istream iterator is the end of the file.

    上面讲解了istream_iterator的基本原理, 很神奇. 我写了使用流迭代器读写用户自定义类到文件的实例代码

    #include <fstream>
    #include <iterator>
    #include <vector>
    
    using namespace std;
    
    class Foo
    {
    
    friend istream& operator>>(istream& o, Foo& f);
    friend ostream& operator<<(ostream& o, const Foo& f);
    
    public:
        Foo():n(0),s(""){}
        Foo(int n, string s) : n(n), s(s) {}
    
    private:
        int n;
        string s;
    };
    
    ostream& operator<<(ostream& o, const Foo& f)
    {
        o << f.n << " " << f.s << endl;
        return o;
    }
    
    istream& operator>>(istream& o, Foo& f)
    {
        o >> f.n;
        o >> f.s;
        return o;
    }
    
    int main()
    {
        ifstream f("id");
        if(f) {
            istream_iterator<Foo> in_iter(f), eof;
            vector<Foo> v(in_iter, eof); // 使用输入流迭代器构造vector
            ofstream o("out");
            if(o) {
                ostream_iterator<Foo> out_iter(o);
                for(auto &e : v) *out_iter++ = e; // 使用输出流迭代器,输出到文件
            } else {
                cout << "open failed" << endl;
            }
        } else {
            cout << "open failed" << endl;
        }
        return 0;
    }

    注意:

    • 自定义类需要支持operator<<operator >>
    • 有默认构造函数
    展开全文
  • c++ istream 读取方法

    千次阅读 2014-03-30 17:07:43
    运算符 即空格符也看过间隔 ...while(cin>>s) cin>>s 为什么可用于条件判断因为 basic_istream  所以其子类即可作判断条件 get() 间隔字符不会从流中丢弃 getline() 间隔字符会从流中丢弃
    运算符<<读取


    即空格符也看过间隔


    while(cin>>s)  cin>>s 为什么可用于条件判断因为 basic_istream 


    所以其子类即可作判断条件

    get()

    间隔字符不会从流中丢弃


    getline()

    间隔字符会从流中丢弃


    展开全文
  • C++ istream get() ostream::put()

    千次阅读 2016-08-25 09:59:00
    get() get()函数比较灵活,有3种常用的重载形式:一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);...

    get()
    get()函数比较灵活,有3种常用的重载形式:

    一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。

    另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。

    还有一种形式的原型是:ifstream &get(char *buf,int num,char delim=’\n’);这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符’\n’。例如:

    file2.get(str1,127,’A’); //从文件中读取字符到字符串str1,当遇到字符’A’或读取了127个字符时终止。

    put() :Inserts character c into the stream.
    ostream& put (char c);

    // typewriter
    #include <iostream>     // std::cin, std::cout
    #include <fstream>      // std::ofstream
    
    int main () {
      std::ofstream outfile ("test.txt");
      char ch;
    
      std::cout << "Type some text (type a dot to finish):\n";
      do {
        ch = std::cin.get();
        outfile.put(ch);
      } while (ch!='.');
    
      return 0;
    }
    展开全文
  • c++ istream转换为std::string

    千次阅读 2017-04-16 21:38:00
    std :: istreambuf_iterator eos ; std :: ...--------------------------------------------------...Perhaps this 1 line C++11 solution: std :: vector s { std :: istreambuf_iterator { in },{}};    
  • #include <iterator> // std::istream_iterator int main () { double value1, value2; std::cout , insert two values: "; std::istream_iterator<double> eos; // end-of-stream iterator std::istream_...
  • #include #include #include #include #include #include using namespace std; ...istream_iterator is(cin); istream_iterator eof; vector text; copy(is, eof, b
  • c++istream类的超详细说明

    千次阅读 2021-04-16 09:32:44
    根据前文,istream类是c++标准输入流的一个基类,本篇详细介绍istream类的主要成员函数用法。 1.istream的构造函数 从istream头文件中截取一部分关于构造函数的声明和定义,如下: public: explicit basic_istream...
  • C++istream的使用

    万次阅读 多人点赞 2016-04-30 17:53:06
    在项目中会经常用到读取一些配置数据,这些数据根据实际需要有可能会调整,如果将这些数据直接嵌入进...最常用到的读取配置文件的方式是使用istream类。 std::istream: input stream. Input stream objects can ...
  • C++ istream::peek()

    2012-12-08 09:38:00
    功能:peek函数用于读取并返回下一个字符,但并不提取该字符到输入流中,也...http://www.cplusplus.com/reference/istream/istream/peek/ 转载于:https://www.cnblogs.com/cszlg/archive/2012/12/08/2910425.html
  • 主要介绍了C++中与输入相关的istream类成员函数简介,包括eof函数和peek函数以及putback函数还有ignore函数,需要的朋友可以参考下
  • 今天在看《STL源码剖析》的时候,看到了配接器中的ostream iterator,其中包含istream_iterator以及ostream_iterator以及更多,感觉这两个都十分重要,所以在这里介绍一下 istream_iterator 源码: template &...
  • C++重载istream和ostream

    千次阅读 2020-10-19 20:16:05
    } 这里重载的 “+”号,是因为我们可以直接去修改对象的值 然而,对于 << >>来说,其左侧必须是istream 或者 ostream的对象,我们没办法去直接改变istream对象的值(不然就得去的源代码中修改),所以也就没办法把...
  • 头文件 #include <sstream> 使用方法-使用istringstream分割string默认以空格作为分隔符 #include <iostream> #include <string> #include <sstream>... string str = "1...
  • 1. 重载    C++的iostream库和C中的stdio库中分别的cout/cin和printf/scanf相比有哪些优势呢? 首先是类型处理更加安全和智能,我们无须应对%d、%f 而且扩展性极强,对于新定义的类,printf想要输入输出一个...
  • c++istream 转为 string

    千次阅读 2016-04-30 17:33:42
    突然遇到istream,还真不知所措,在使用boost中,各种stream流被虐,今天一个需求就是把istream转为string,如下:std::shared_ptr<boost::asio::streambuf> read_buffer(new boost::asio::streambuf); ......//字符...
  • C++ primer 第五版 中文版 练习 10.33 题目:编写程序,接受三个参数:一个输入文件和两个输出文件的文件名。输入文件保存的应该是整数。使用istream_iterator 读取输入文件。使用ostream_iterator将奇数写入第一个...
  • 初始化时读取: std::ifstream input_stream("file", ...std::string file_string(std::istream_iterator<char>{input_stream}, std::istream_iterator<char>{}); 直接读取: std::string file_string...
  • C++】cin输入istream流使用总结

    千次阅读 2019-02-17 10:20:37
    和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数 应用:cin输入空格作为结束 PListHead CreatList ( ) { PListHead pHead = new ListNode ; ...
  • //建,但是不支持同时有in,out ,猜测c++鼓励读写分开? if (my_w_r >> s) //读取can.txt的内容并存入 s { if (s != "\n") //没有遇到换行符 { cout ; //直接打印内容到屏幕上 other_file ; //将s的...
  • C++ 头文件系列(istream)

    2017-02-16 11:11:00
    其实叫它istream有点不合适,因为该头文件不仅定义了istream,还定义了iostream。 2. basic_istream模版 basic_istream继承自basic_ios,也是其它输入流的基类。 2.1 sentry类 The class sentry defines a class ...
  • C++中输入流istream状态管理1

    千次阅读 2017-10-24 22:17:38
    其中,用istream及其派生类表示输入流,用ostream及其子类表示输出流,用iostream及其子类表示输入输出流。 1 输入流与cin cin是输入流istream类的对象,它是一个全局变量。cin通过提取符(extractor)“>>”从流中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,497
精华内容 12,198
关键字:

c++istream

c++ 订阅