概述
I/O(输入/输出)流类库提供对象之间的数据交互服务。
流类库预定义了一批流对象,连接常用的外部设备。
可以定义所需的I/O流对象,使用流库提供的工作方式实现数据传输。
一、流类和流对象
与输入设备(如键盘)相联系的流称为输入流。
与输出设备(如屏幕)相联系的流称为输出流。
与输入输出设备相联系的流称为输入输出流。
(1).流的种类
a.文本流是一串ASCII字符,如数字12在文本流中的表示方法为1与2的ASCII码31H与32H。
源程序文件和文本文件在传送时均采用文本流。
通常,文本流在不同的设备之间传送时,可能要作一些变换(windows 操作系统需要,而在linux下不需要变换)
b.二进制流是由一串二进制数组成,如数字12在二进制流中的表示方式为00001100。
二进制流是将数据以二进制形式存放的,这种流与设备上的输入输出一一对应,在数据传送时不需作任何变换。
(2)缓冲流与非缓冲流
系统在主存中开辟的用于临时存放输入/输出流信息的内存区称缓冲区。
输入/输出流也相应的分成缓冲流与非缓冲流。
(3).C++流类库具有两个平行的基类,即streambuf类和ios类,
ios类为输入输出操作在用户一方的接口,负责高层操作;
streambuf类为输入输出操作在物理设备一方的接口,负责低层操作。
a.ios:
istream-输入流【ifstream-输入文件流,istream_withassign-重载运算符“=”,istrsream-输入串流】
ostream-输出流【ofstream-输出文件流,ostream_withassign-重载运算符“=”,ostrsream-输出串流】
iostream-输入输出流【fstream-输入/输出文件流,strstream-输入/输出串流,stdiostream-标准输入/输出流】
(4).
iostream 包含操作所有输入/输出流所需的基本信息,含有cin、cout、cerr、clog对象,提供无格式和格式化的I/O
iomanip 包含格式化I/O操纵算子,用于指定数据输入输出的格式
fstream 处理文件信息,包括建立文件,读/写文件的各种操作接口
例题一:用get函数从键盘输入字符
#include<iostream>
using namespace std;
int main()
{
char c;
cout<<"Enter first sentence followed by Entern";
while((c=cin.get())!='n')
cout.put(c);//读取一行字符
cout<<endl;
cout << "Enter second sentence followed by Entern" ;
while(cin.get(c))//
{
if(c=='n') break;
cout.put(c);
}
cout<<endl;
cout<<"Enter third sentence followed by Entern" ;
char s[80];
cin.get(s,10);
cout<<s<<endl;
}
补充:
cin cin.get() cin.getline()
1.cin,cin输入遇到缓冲区的“enter”(回车)、“space”()、“tab”(空格)会结束当前输入,并舍弃“enter”“space”“tab”进行下一项输入
2.cin.get()
该函数有多种格式,包括无参,一个参数,两个参数,三个参数;
一个参数:
用法:a=cin.get()或者cin.get(a)
结束需要输入字符数够后回车
例:(可以这样控制输入)
while((c=cin.get())!='n')
cout.put(c);
这样再输入结束后一个回车便可完成输入
与cin不同,cin.get()遇到缓冲区的“enter”“space”“tab”不会结束当前输入。
两个参数:
用法:cin.get(arrayname,size)把字符输入到arrayname中,长度不超过size;
arrayname只能是char[]类型,不可以为string类型,size包括“ ”。
三个参数:
用法:cin.get(arrayname,size,s),当长度达到size或者遇到字符s结束输入
3.cin.getline()
cin.getline()与cin.get()用法相似,也有重载,可以无参,一参,二参,三参。但也有区别
cin.get(arrayname,size)当遇到[enter]时会结束目前输入,他不会删除缓冲区中的[enter]cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter]
//借鉴例子
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.get(a,10);
cin.get(b);
cout<<a<<endl<<int(b);
}
输入:12345[enter]
输出:12345 【换行】 10
说明:cin.get(a,10)把12345到a中,遇到[enter]结束,但是不把[enter]删除,则把[enter]输入到b中,(enter的ASCALL码为10)
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.getline(a,10);
cin.get(b);
cout<<a<<endl<<int(b);
}
输入:12345[enter]a[enter]
输出:12345【换行】97
说明:cin.getline(a,10)吧12345输入到a中,遇到{enter}结束,并把缓冲区中[enter]删除,把接下来的a输入到b中
(2)cin.getline(arrayname,size,s)与cin.gei(arrayname,size,s)的区别
cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除
cin.get(arrayname,size,s)当遇到s时会结束输入,但不会删除缓冲区中的s
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.get(a,10,',');
cin.get(b);
cout<<a<<endl<<b;
}
输入:12345,[enter]
输出:12345【换行】,
说明:cin,get不会删除缓冲区的,
#include<iostream>
using namespace std;
int main()
{
char a[10];char b;
cin.getline(a,10,',');
cin.get(b);
cout<<a<<endl<<int(b);
}
输入:12345,[enter]
输出:12345【换行】10
说明:cin.getline吧12345输入到a中,遇到’,‘结束,并删除缓冲区的’,‘,后面的[enter]输入到b中
二、输出流操作
ostream类的公有成员函数
函数--功能
put--无格式,插入一个字节
write--无格式,插入一个字节序列
flush--刷新输出流
seekp--移动输出流指针
tellp--返回输出流中指定位置的指针值
operstor--插入运算符
三、格式控制
ios提供直接设置标志字的控制格式函数
iostream和iomanip库还提供了一批控制符简化I/O格式化操作
(1).ios的标志常量
(2).ios类中的控制格式的函数
函数 | 功能 |
long flags( long lFlags ); long flags() const; | 用参数lFlags更新标志字 返回标志字 |
long setf( long lFlags ); long setf( long lFlags,long lMask ); | 设置lFlags指定的标志位 将lMask指定的位清0,然后设置lFlags指定位 |
long unsetf( long lMask ); | 将参数lMask指定的标志位清0 |
int width( int nw ); | 设置下一个输出项的显示宽度为nw |
char fill( char cFill ); | 空白位置以字符参数cFill填充 |
int precision( int np ); | 用参数np设置数据显示精度 |
(3).iostream几个常用的控
控制符 | 功能 |
endl | 输出一个新行符,并清空流 |
ends | 输出串结束符,并清空流 |
flush | 清空流缓冲区 |
dec | 用十进制表示法输入或输出数值 |
hex | 用十六进制表示法输入或输出数值 |
oct | 用八进制表示法输入或输出数值 |
ws | 提取空白字符 |
(4).iomanip的控制符
控制符 | 功能 |
resetiosflags ( ios::lFlags ) | 清除lFlags指定的标志位 |
setiosflags ( ios::lFlags ) | 设置lFlags指定的标志位 |
setbase ( int base ) | 设置基数,base = 8,10,16 |
setfill ( char c ) | 设置填充符c |
setprecision ( int n ) | 设置浮点数输出精度 |
setw ( int n ) | 设置输出宽度 |
例题二:设置输出宽度
#include<iostream>
using namespace std;
int main()
{
char*s="Hello";
cout.fill('*');//设置填充符
cout.width(10);//设置输出宽度
cout<<s<<endl;
cout.width(15);
cout.setf(ios::right,ios::left);//逗号,清除左对齐标志位,置右对齐
cout<<s<<endl;
return 0;
}
例题2三:不同基数形式的输入输出
方法一:(设置标志字)
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cout<<"十进制:";
cin.setf(ios::dec,ios::basefield);//置十进制输入,basefiled中存当前进制
cin>>a;
cout<<"十六进制:";
cin.setf(ios::hex,ios::basefield);
cin>>b;
cout<<"八进制:";
cin.setf(ios::oct,ios::basefield);
cin>>c;
cout<<"十进制:n";
cout.setf(ios::dec,ios::basefield);
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
cout<<"十六进制:n";
cout.setf(ios::hex,ios::basefield);
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
cout<<"十进制:n";
cout.setf(ios::oct,ios::basefield);
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
return 0;
}
方法二:(格式控制符)
//不同基数形式的输入输出
#include<iostream>
using namespace std;
int main()
{
int a,b,c;
cout<<"十进制:";
cin>>dec>>a;
cout<<"十六进制:";
cin>>hex>>b;
cout<<"八进制:";
cin>>oct>>c;
cout<<"十进制:n";
cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
cout<<"十六进制:n";
cout<<hex<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
cout<<"十进制:n";
cout<<oct<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
return 0;
}
例题四:
格式化输出浮点数
方法一:
#include<iostream>
using namespace std;
int main()
{
double x=22.0/7;
int i;
cout<<"output in fixed:n";
cout.setf(ios::fixed|ios::showpos);//定点输出,显示正号;|是或操作
for(i=1;i<=5;i++)//用不同的精度输出
{
cout.precision(i);
cout<<x<<endl;
}
cout<<"科学计数法:n";
cout.setf(ios::scientific,ios::fixed|ios::showpos);//清除原数据,科学计数法输出
for(i=1;i<=5;i++)
{
cout.precision(i);
cout<<x*1e5<<endl;
}
return 0;
}
方法二:
例题五:格式化输出浮点数
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
double x=22.0/7;
int i;
cout<<"output in fixed:n";
cout<<setiosflags(ios::fixed|ios::showpos);//定点输出,显示正号;|是或操作
for(i=1;i<=5;i++)//用不同的精度输出
cout<<setprecision(i)<<x<<endl;
cout<<"科学计数法:n";
cout<<resetiosflags(ios::fixed|ios::showpos)<<setiosflags(ios::scientific);//清除原数据,科学计数法输出
for(i=1;i<=5;i++)
{
cout<<setprecision(i)<<x*1e5<<endl;
}
return 0;
}
四、文件处理
文件输入流——ifstream——读文件
文件输出流——ofstream——写文件
1.打开文件:
a方法.先建立流对象,然后调用open函数连接外部文件
{
流类对象名;
对象名.open(文件名,方式);
}
打开一个已有文件datafile.dat,准备读:
{
ifstream infile;//建立输入文件流对象
infile.open("datafile.dat",ios::in);//连接文件,读方式打开文件
}
打开一个文件newfile.dat,准备写:
{
ofstream outfile;//建立输出文件流对象
outfile.open("d:\newfile.dat",ios::out);//连接文件,写方式打开文件
}
b方法:调用;流类带参数的构造函数,在建立流对象的同时连接外部文件
例如:
{
ifstream infile ( "datafile.dat" , ios::in ) ;
ofstream outfile ( "d:\newfile.dat" , ios::out );
fstream rwfile ( "myfile.dat" , ios::in | ios::out ) ;
}
打开文件例:
ofstream ost;
ost.open("d:\test1.txt");
if(!ost.is_open())
{
cout<<"can not open file.";
return 1;
}
ifstream ist("d:\test1.txt");
if(!ist)
{
cout<<"can not open file.";
return 1;
}
2.关闭文件
{
ifstream infile;
infile.open("file.txt",ios::in);
......
infile.close//关闭file。txt;
infile.open("file2.txt",ios::in);//重用流对象
}
例题六:打开和关闭文件例题
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
ofstream ost;
ost.open("d:\my1.txt");
if(!ost.is_open())
{
cout<<"can not open file.";
return 1;
}
ost<<20<<endl;
ost<<30.5<<endl;
ost.close();
ifstream ist("d:\my1.tex");
if(!ist.is_open())
{
cout<<"can not open file.";
return 1;
}
int n ;
double d ;
ist >> n >> d ;
cout << n << endl << d << endl ;
return 0;
}
例题七:把文件 d:test 复制到文件 d:testnew 中
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
char ch;
ifstream f1("d:\test.txt");
if(!f1)
{
cout<<"can not open file.";
return 1;
}
ofstream f2("d:\testnew.txt");
if(!f2)
{
cout<<"can not open file.";
return 1;
}
while(f1.get(ch))
{
f2.put(ch);
cout<<ch;
}
f1.close();
f2.close();
cout<<"It is over!n";
return 0;
}
标识常量 | 意义 |
ios::in | 读方式打开文件 |
ios::out | 写方式打开文件 |
ios::ate | 打开文件时,指针指向文件尾 |
ios::app | 追加方式 |
ios::trunc | 删除文件现有内容 |
ios::nocreate | 如果文件不存在,则打开操作失败 |
ios::noreplace | 如果文件存在,则打开操作失败 |
ios::binary | 二进制方式打开,默认为文本方式 |
五、文本文件
六、二进制文件
最后
以上就是懦弱金针菇为你收集整理的复习七——输入输出流的全部内容,希望文章能够帮你解决复习七——输入输出流所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复