流概述

   流是C++标准的组成部分,流的主要目标是,将从磁盘读取文件或将输入写入控制台屏幕的问题封装起来,创建流后程序猿就能够使用它。流将负责处理全部的细节。

IO类库

在C++输入、输出操作是通过C++系统提供的完毕I/O操作的一组类实现的。

主要包括:

标准流类:处理与标准输入设备(键盘)和输出设备(显示器)关联的数据流
文件流类:处理与磁盘文件关联的数据流
字符串流类:利用内存中的字符数组处理数据的输入输出

异常类等:处理异常错误.
标准IO对象:
     包括iostream类的C++程序启动时。将创建并初始化4个对象。
     1、cin :处理来自标准输入的设备(键盘)的输入。
      2、cout:处理到标准输出设备(控制台屏幕)的输出
      3、cerr: 处理到标准错误设备(控制台屏幕)的非缓冲输出,因为这是非缓冲的。所以发送到cerr的不论什么数据都被马上写入标准错误设备。而不等缓冲区填满或者刷新指令
      4、clog:处理输出到标准错误设备(控制台屏幕)的缓冲错误信息。
     注意:cin 在遇到空格或者换行符时标示输入结束。
/*File : cerr.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/ #include <iostream> using namespace std; /*格式化输出
*输出缓冲遇到换行,有输入、满、程序结果、flush会刷新
*/ int main()
{
char ch;
cerr << "World "; /*无缓冲。不可重定向*/
cin >> ch;
clog << "Clog "; /*理论上“缓冲,不可重定向”实际上无缓冲*/
cout << "Hello "; /*缓冲,可重定向*/ //输入随意字符退出
cin >> ch;
return 0;
}

看输出:

问题:从上面的输出结果。貌似cout也不是带缓冲的,不知道是我理解的问题,还是代码写的有错误,求解?
 以下是一些基本函数的使用方法
/*File : get.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/ #include <iostream> using namespace std; int main()
{
char ch;
while((ch = cin.get()) != EOF ){
if (ch == '$'){
break;
}
cout <<"ch = " << ch << endl;
} cout << "Done" << endl;
cin.ignore(10,'\n'); char s[25];
cin.get(s,25);
cout << s << endl;
return 0;
}

输出结果:

/*File : cerr.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/ #include <iostream>
#include <string> using namespace std; /*i.get() 从键盘输入一个字符
*o.put() 往屏幕输出一个字符
*i.getline() 从键盘输入一串字符串
*i.putback() 插入字符。
*i.peek() //查看输入缓冲区的第一个字符
*/ void get_put()
{
cout << "####请输入四个字符或者数字###" << endl;
int n = cin.get();
char c,d,e;
cin.get(c).get(d).get(e);// istream& get(char& ch); cout << "n = " <<n << endl;
cout << "c = " <<c << endl;
cout << "d = " <<d << endl;
cout << "e = " <<e << endl; cout << "还有一种输出方法" <<endl;
cout.put(n).put(c).put(d).put(e);
//忽略前200个字符除非遇到字符'\n',而停止忽略字符
cin.ignore(200,'\n');
char ch;
cin >> ch;
cout << "ch = " <<ch << endl;
cin.ignore(200,'\n');
}
void mygetline()
{
char buf[10]={'\0'};
cout << "####start getline ###" <<endl;
cout << "cin.getline 输入字符串。长度不要超过9个,'\0' 10个" <<endl;
cin.clear(); if(!cin.getline(buf,sizeof(buf))){
cout << "行输入过长,错误" <<endl;
cin.clear();
/*清除输入过长的部分,应该不会超过1000个吧!*/
cin.ignore(1000,'\n');
} string s;
cout << "使用getline 全局函数输入字符串:" <<endl;
getline(cin,s);//getline(cin,s,'s')
cout << "buf = " << buf<<endl;
cout << "s = " << s << endl;
cout << "printf 输出s :" <<endl;
printf("%s\n",s.c_str());
cout << "####end getline ###" <<endl;
} void mypeek()
{
char buf[10];
char c; cout << "请输入一个字符," << endl;
cin >>ws;//屏蔽掉空格
c = cin.get(); cin.putback(c);
if(cin.peek()> '0' && cin.peek() < '9'){ double d;
cout <<"请输入一个浮点数" << endl;
cin >> d;
cout << "d = " << d << endl;
}else{
string s;
cout <<"请输入一串字符串" << endl;
cin >> s ;
cout <<"s = " << s << endl;
} }
int main2()
{ //get_put(); //mygetline(); //mypeek();
return 0;
}

文件的输入和输出:

   以下介绍打开和关闭文件的流对象, ifstream ofstream
/*File : file.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/ #include <iostream>
#include <fstream> using namespace std; char filename[80]; /*打开文件进行读写*/
void fout_fin()
{ char buffer[255];
cout << "请输入文件名称字:" << endl;
cin >> filename; ofstream fout(filename);// open for writing
fout << "####start######" << endl;
cout << "输入一字符串写入文件里" << endl;
cin.ignore(1,'\n');//重新启动新行(将刚才输入的文件名称忽略掉)。写入文件里,
cin.getline(buffer,255);
fout <<buffer <<endl;
fout << "####end####" << endl;
fout.close(); ifstream fin(filename);
cout << "###### 输入文件的内容" << endl;
while(fin.getline(buffer,255)){
cout <<buffer<<endl;
}
fin.close();
} /*打开文件的默认行为
* ios::app: 附加到已有文件的末尾,而不是删除其内容
* ios::ate: 跳到文件末尾,但能够在文件的人和地方写入数据
* ios::truc: 默认值,删除已有文件的内容
* ios::binary: 以二进制方式打开文件。缺省的方式是文本方式。 两种方式的差别见前文
* ios::in : 以输入方式打开
* ios::out: 以输出方式打开
*/
/*在文件末尾追加内容*/
void append_file()
{
ofstream fout;
char buff[256]; fout.open(filename,ios::app);
if(!fout){
cout << "打开文件失败。" << endl;
return;
} cout << "追加一字符串写入文件里" <<endl;
cin.getline(buff,256);
fout <<"#### start append file ####" <<endl;
fout << buff << endl;
fout <<"#### end append file ####" <<endl;
fout.close(); ifstream fin(filename);
if(!fin){
cout <<"打开文件失败。 " <<endl;
return;
}
cout << "###### 输入文件的内容" << endl;
while(fin.getline(buff,256)){
cout <<buff<<endl;
}
fin.close();
} int main()
{
fout_fin(); append_file(); return 0;
}

输出:

 3、strstream ostrstream istrstream

    控制字符串字符的输入和输出流。

/*File : strstream.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/ #include <iostream>
#include <strstream> using namespace std; /*istrstream类用于运行C风格的串流的输入操作,也就是以字符串数组作为输入设备。
*ostrstream类用于运行C风格的串流的输出操作,也就是一字符串数组作为输出设备。
*strstream类同一时候能够支持C风格的串流的输入输出操作。
*
*利用istrstream类创建类对象,制定流输入设备为字符串数组,
*通过它向一个字符型对象输入数据
*/
void in_str()
{
char *name = "my name is sjin";
int size = strlen(name)+1; istrstream istr(name,size);
//strstream istr(name,size,ios::in); char temp[100];
istr.getline(temp,100);
cout << temp << endl;
} /*类ostrstream用于运行串流的输出
*/ void out_str()
{
char *buf = new char[10];
char *ptemp = "sjin";
ostrstream ostr(buf,10,ios::out); //使用ostrstream输出到流对象的时候,用ends结束字符串
ostr<<ptemp<<ends;
cout << buf <<endl;
delete[] buf; }
int main()
{
in_str(); out_str(); return 0;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2ppbl8xMzE0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

4、stringstream

/*File : sstream.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/ #include <iostream>
#include <string>
#include <sstream> using namespace std; void convert_type()
{
stringstream sstr;
int a = 100;
//
sstr<< a;
cout <<"a :"<<a<<" 转换成字符串:"<< sstr.str() << endl; sstr.clear();//why can not clear?? string name= "colinguan";
char cname[200];
sstr << name;
sstr>>cname;
cout << cname; } int main()
{
stringstream ostr("sjin123123123123123123123123123123123"); ostr.put('d');
ostr.put('e');
ostr << " love me";
cout << ostr.str() << endl;
char buff[1024];
ostr.getline(buff,1024);
cout <<buff << endl; convert_type(); return 0

输出:

5 io-state 输入输出的状态

   C++中负责的输入/输出的系统包括了关于每个输入/输出操作的结果的记录信息。

这些当前的状态信息被包括在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包括的值。

 
 goodbit 无错误  
 Eofbit 已到达文件尾  
 failbit 非致命的输入/输出错误。可挽回   badbit 致命的输入/输出错误,无法挽回  
有两种方法能够获得输入/输出的状态信息。

一种方法是通过调用rdstate()函数:

还有一种方法则是使用以下不论什么一个函数来检測对应的输入/输出状态:  bool bad();bool eof();bool fail();bool good(); 

/*File : io_state.cpp
*Auth : sjin
*Date : 20140506
*Mail : 413977243@qq.com
*/ #include <iostream>
#include <string>
#include <sstream> using namespace std; void io_state()
{
int a; cin >> a;
cout <<cin.rdstate() <<endl; if(cin.rdstate() == ios::goodbit){
cout << "rdstate输入数据的类型正确,无错误" <<endl;
} if(cin.rdstate() == ios_base::failbit){
cout <<"rdstate输入数据类型错误。非致命错误,可清除输入缓冲区" <<endl;
}
cin.clear();
cin.clear(ios::goodbit);
} void good_fail()
{
int a; cin >> a;
cout <<cin.rdstate() <<endl; if(cin.good()){
cout << "good_fail输入数据的类型正确,无错误" <<endl;
} if(cin.fail()){
cout <<"good_fail输入数据类型错误,非致命错误,可清除输入缓冲区" <<endl;
} } int main()
{
cout << "输入正确类型 11" << endl;
io_state();
cout << "输入正确类型 C" << endl;
io_state(); //还有一种方法则是使用以下不论什么一个函数来检測对应的输入/输出状态: bool bad();bool eof();bool fail();bool good();
cout << "输入正确类型 11" << endl;
good_fail();
cout << "输入正确类型 C" << endl;
good_fail();
}

參考资料:

1、C++ 标准IO库知识整理

走进C++程序世界------IO标准库介绍的更多相关文章

  1. 《挑战30天C++入门极限》C++的iostream标准库介绍(3)

        C++的iostream标准库介绍(3) C语言提供了格式化输入输出的方法,C++也同样,但是C++的控制符使用起来更为简单方便,在c++下有两中方法控制格式化输入输出. 1.有流对象的成员函 ...

  2. 《挑战30天C++入门极限》C++的iostream标准库介绍(2)

        C++的iostream标准库介绍(2) 接下来我们继续看一下C++风格的串流控制,C++引入了ostringstream.istringstream.stringstream这三个类,要使用 ...

  3. 《挑战30天C++入门极限》C++的iostream标准库介绍(1)

        C++的iostream标准库介绍(1) 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同 ...

  4. Python的标准库介绍与常用的第三方库

    Python的标准库介绍与常用的第三方库 Python的标准库: datetime:为日期和时间的处理提供了简单和复杂的方法. zlib:以下模块直接支持通用的数据打包和压缩格式:zlib,gzip, ...

  5. C++著名类库和C++标准库介绍

    C++著名类库 1.C++各大有名库的介绍——C++标准库 2.C++各大有名库的介绍——准标准库Boost 3.C++各大有名库的介绍——GUI 4.C++各大有名库的介绍——网络通信 5.C++各 ...

  6. OSS.Social微信项目标准库介绍

    经过本周的努力,昨晚终于完成OSS.Social微信项目的标准库支持,当前项目你已经可以同时在.net framework和.net core 中进行调用,调用方法也发生了部分变化,这里我简单分享下, ...

  7. C++的iostream标准库介绍+使用详解(转)

    0 为什么需要iostream 我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的 stdio库不同,它从一开始就是 ...

  8. c++ io标准库2

    转自:http://www.2cto.com/kf/201110/109445.html 接下来我们来学习一下串流类的基础知识,什么叫串流类? 简单的理解就是能够控制字符串类型对象进行输入输出的类,C ...

  9. python标准库介绍——12 time 模块详解

    ==time 模块== ``time`` 模块提供了一些处理日期和一天内时间的函数. 它是建立在 C 运行时库的简单封装. 给定的日期和时间可以被表示为浮点型(从参考时间, 通常是 1970.1.1 ...

随机推荐

  1. 【cs229-Lecture7】支持向量机(SVM)

    SVM不错的学习资料: 百度网盘链接: http://pan.baidu.com/s/1hqw0Rnm 密码: asec blog:http://www.blogjava.net/zhenandaci ...

  2. 【分布式系列之ActiveMq】ActiveMq入门示例

    前言 github地址:https://github.com/AndyFlower/web-back/tree/master/ActiveMq01 下载ActiveMQ :http://activem ...

  3. java(5) 线程

    1.理清概念 并行与并发: *并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时. *并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时.并发往往在场 ...

  4. rman 中遇到 ORA-01861

    RMAN> run{ 2> sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"'; 3> ...

  5. Oracle 12C 创建用户连接pdb

    测试环境: C:\ora12c\product\12.1.0\dbhome_1\BIN>sqlplus.exe /nolog SQL*Plus: Release 12.1.0.1.0 Produ ...

  6. git 推送出现 "fatal: The remote end hung up unexpectedly"

    原因:原因是推送的文件太大 解决方案: 注意,有时候会看不到.git文件,可能被隐藏了,在这里勾选上隐藏的项目,就可以看到了. 第一种,全局设置 在C:\Users\wang\git\.git\con ...

  7. java.util.concurrent.Future Basics

    Hereby I am starting a series of articles about future concept in programming languages (also known ...

  8. ZOJ 3435 Ideal Puzzle Bobble

    ZOJ Problem Set - 3435 Ideal Puzzle Bobble Time Limit: 2 Seconds      Memory Limit: 65536 KB Have yo ...

  9. Dumb Bones UVA - 10529[多米诺重构]

    Dumb Bones UVA - 10529   来自绿书p176  题意 你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰 ...

  10. 基于Python的跨平台端口转发工具

    背景 使用lcx也好,nc也好,总是会被安全防护软件查杀,所以想着自己写一个.顺面学习一下,端口转发的原理. 端口转发的逻辑 端口转发的逻辑很简单开启两个scoket,一个绑定IP端口进行listen ...