C++编程思想 第2卷 第7章 通用容器 更多迭代器 预定义迭代器 更多的流迭代器

流迭代器 ostream_iterator 输出迭代器 和
istream_iterator输入迭代器
输出流是没有 结束 这个概念的
因为用户总是持续写出更多的元素

//: C07:StreamIt.cpp
// From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison.
// (c) 1995-2004 MindView, Inc. All Rights Reserved.
// See source code use permissions stated in the file 'License.txt',
// distributed with the code package available at www.MindView.net.
// Iterators for istreams and ostreams.
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
#include "../require.h"
using namespace std;

int main() {
  ifstream in("StreamIt.cpp");
  assure(in, "StreamIt.cpp");
  istream_iterator<string> begin(in), end;
  ostream_iterator<string> out(cout, "\n");
  vector<string> vs;
  copy(begin, end, back_inserter(vs));
  copy(vs.begin(), vs.end(), out);
  *out++ = vs[0];
  *out++ = "That's all, folks!";
  getchar();
} ///:~


输出  要读取StreamIt.cpp 所以当前目录放文件
//:
C07:StreamIt.cpp
//
From
"Thinking
in
C++,
Volume
2",
by
Bruce
Eckel
&
Chuck
Allison.
//
(c)
1995-2004
MindView,
Inc.
All
Rights
Reserved.
//
See
source
code
use
permissions
stated
in
the
file
'License.txt',
//
distributed
with
the
code
package
available
at
www.MindView.net.
//
Iterators
for
istreams
and
ostreams.
#include
<fstream>
#include
<iostream>
#include
<iterator>
#include
<string>
#include
<vector>
#include
"../require.h"
using
namespace
std;
int
main()
{
ifstream
in("StreamIt.cpp");
assure(in,
"StreamIt.cpp");
istream_iterator<string>
begin(in),
end;
ostream_iterator<string>
out(cout,
"\n");
vector<string>
vs;
copy(begin,
end,
back_inserter(vs));
copy(vs.begin(),
vs.end(),
out);
*out++
=
vs[0];
*out++
=
"That's
all,
folks!";
}
///:~
//:
That's all, folks!


当in用完输入时
init与end相等
于是copy()终止

因为out是一个ostream_iterator<string>
使用运算符operator=可以分批任何string对象给解析后的迭代器虽然会创建一个istream_iterator<char>和ostream_iterator<char>
但实际上这样做从语法分析输入并且导致诸如自动地吃掉空白字符
空格 制表符和换行符
如果希望用一个输入流的精确地表现这样的动作
是不可取的

//: C07:StreambufIterator.cpp
// From "Thinking in C++, Volume 2", by Bruce Eckel & Chuck Allison.
// (c) 1995-2004 MindView, Inc. All Rights Reserved.
// See source code use permissions stated in the file 'License.txt',
// distributed with the code package available at www.MindView.net.
// istreambuf_iterator & ostreambuf_iterator.
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include "../require.h"
using namespace std;

int main() {
  ifstream in("StreambufIterator.cpp");
  assure(in, "StreambufIterator.cpp");
  // Exact representation of stream:
  istreambuf_iterator<char> isb(in), end;
  ostreambuf_iterator<char> osb(cout);
  while(isb != end)
    *osb++ = *isb++; // Copy 'in' to cout
  cout << endl;
  ifstream in2("StreambufIterator.cpp");
  // Strips white space:
  istream_iterator<char> is(in2), end2;
  ostream_iterator<char> os(cout);
  while(is != end2)
    *os++ = *is++;
  cout << endl;
  getchar();
} ///:~

输出
//:C07:StreambufIterator.cpp//From"ThinkinginC++,Volume2",byBruceEckel&ChuckAllison.//(c)1995-2004MindView,Inc.AllRightsReserved.//Seesourcecodeusepermissionsstatedinthefile'License.txt',//distributedwiththecodepackageavailableatwww.MindView.net.//istreambuf_iterator&ostreambuf_iterator.#include<algorithm>#include<fstream>#include<iostream>#include<iterator>#include"../require.h"usingnamespacestd;intmain(){ifstreamin("StreambufIterator.cpp");assure(in,"StreambufIterator.cpp");//Exactrepresentationofstream:istreambuf_iterator<char>isb(in),end;ostreambuf_iterator<char>osb(cout);while(isb!=end)*osb++=*isb++;//Copy'in'tocoutcout<<endl;ifstreamin2("StreambufIterator.cpp");//Stripswhitespace:istream_iterator<char>is(in2),end2;ostream_iterator<char>os(cout);while(is!=end2)*os++=*is++;cout<<endl;getchar();}///:~

从语法上来分析 流迭代器使用由istream::operator>>来定义
如果直接从语法上分析字符的话不是你说希望的
要从字符流中将所有的空白字符都去掉的做法罕见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值