我是靠谱客的博主 懦弱金针菇,最近开发中收集的这篇文章主要介绍复习七——输入输出流,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 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二进制方式打开,默认为文本方式

五、文本文件
六、二进制文件

最后

以上就是懦弱金针菇为你收集整理的复习七——输入输出流的全部内容,希望文章能够帮你解决复习七——输入输出流所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部