[C++STDlib基础]IO输入输出流概述

IO

C++语言中没有定义专门的输入输入(I/O)语句。输入输出操作是通过IO流实现的。在C++编译系统中带有一个面向对象的IO软件包,这就是IO流类库。

流概念

“流(stream)”实际上是一个字节序列(字节流),是指数据从一个位置流向另一个位置的抽象。在C++程序中,数据可以从键盘或外部文件流入到程序的数据结构中(输入),也可以从程序中流向屏幕或外部文件(输出)。通常把从流中获取数据的操作(读操作)称为提取操作,而向流中添加数据的操作(写操作)称为插入操作。流是有方向的,故会出现输入流和输出流的对立面。IO流:数据在外部设备和内存之间的流动。

文件概念

文件:存储在外部设备上的数据的集合。它可以使数据得以长期保存。

C++把每个文件都看成是一个有序的字节序列,每个文件都以文件结束标志结束。

C++程序中处理的数据文件按数据组织形式可分为:

  • ASCII文件(文本文件) :文件中的信息形式为ASCII码字符,每个字符占一个字节。数字3.14159存储是占7个字节。
  • 二进制文件(内部格式文件):把内部中的数据按其在内存中的存储形原样输出到磁盘上。数值数据按二进制方式存储,字符仍按ASCII方式存储。数字3.14159存储是占4个字节。

C++ I/O流概述 

IO流的类层次图


<ios>虚基类

定义了IO流类的虚基类ios,通常不直接用它。以下关于输入输出的类都是ios的派生类。

<fstreambase>文件流基类

<strstreambase>字符串流基类

<istream>输入流类库

<ostream>输出流类库

<iostream>标准IO流类

ifstream  输入文件流类

ofstream 输出文件流类

fstream   输入输出文件流类   这三个类都定义在头文件<fstream>中

<istrstream>输入字符串流

<ostrstream>输出字符串流

<strstream>输入输出字符串流

备注:

经常用到的是<iostream><fstream><strstream>输入输出流/文件流/字符串流库

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

C++C++流类中已预定义了四个对象

cin:是istream类的对象

标准输出,通常是键盘,用于处理标准输入设备(键盘)的输入

cout:是ostream类的对象

标准输入,通常是显示器,用于处理标准输出设备(显示器)的输出有缓冲

cerr:是ostream类的对象

标准错误,通常是显示器,用于处理在标准设备(显示器)上输出出错信息(不带缓冲,即立即显示);

clog:是ostream类的对象

标准日志,通常是显示器,用于处理在标准输出设备(显示器)上输出错误信息(有缓冲),当缓冲区满时输出。

备注:输出缓冲遇到换行,有输入,flush,满,程序结束时自动刷新。

流插入(<<)和提取(>>)运算符:<<输出(应用于cout,cerr,clog)>>输入(应用于cin)

输出流

输出流:与输出设备(如屏幕)相关联的流。即由内存流向外部设备的数据流。

C++输出流类主要是ostreamofstream,ostrstream

ostream类最适合顺序文本的输出,通常使用coutcerrclog这些预定义的对象实现输出操作。

ofstream类还支持磁盘文件的输出。C++中,磁盘文件被看做一个字符序列。要处理磁盘文件,就需要定义文件输出流对象。

定义文件输出流对象

方法1:先定义文件对象,然后调用open成员函数打开该文件。

ofstream outfile;//创建文件输出流对象

outfile.open(“datal.tex”,ios::out);//打开文件,使流对象与文件”datal.txt”关联

方法2:在定义文件输出流对象时初始化打开文件

ofstream outfile.open(“datal.tex”,ios::out);

输出流常用成员函数

put()

输出流对象名.put(char ch) 该函数仅输出一个字符,且返回当前输出流对象。例如: cout.put(A).put(t); 输出结果为:At

write()

输出流对象名.write(char *s,int n)  

该函数输出字符指针所指向的字符串中的n个字符。当s所指字符串不足n时补空格函数返回当前输出流对象。例如

cout.write("12345",3).write("ABCDE",7).put(t); 

输出结果为:123ABCDE   t 

seekp()

输出流对象名.seekp(流中位置

    输出流对象名.seekp(偏移量,参照位置)  

  其中,流中位置、偏移量均为long,以字节为单位。 

  参照位置有三种:

   — beg(0)表示相对于流的开始位置

   — cur(1)表示相对于当前写指针所指向的位置

   — end(2)表示相对于流的结尾处

    seekp函数是设置文件输出流写指针位置用的,指出下次写出数据的起始位置。利用该指针可实现向磁盘文件随机输出。它们均返回当前输出流对象。

tellp()

 输出流对象名.tellp()  

该函数返回当前输出流写指针的位置值。 

close()

C++,对磁盘文件操作后均需关闭。该函数的用法是

   输出流对象名.close()  

    该函数既无参数,也无返回值。当程序正常结束时不用此函数也可以完成同样的作用。

eof()

输出流对象.eof()  

执行该函数时,若遇到文件结尾的条件,则返回非0值。 

输入流

输入流:与输入设备(如键盘)相联系的流。即由外部设备流向内存的数据流。

C++的输入流类主要是istreamifstream。前者最适合输入顺序文本,通常使用预先定义的流对象cin处理;后者支持磁盘文件的输入。这些文件或是一个文本文件,或是一个二进制文件。与处理磁盘输出文件类似,要处理磁盘输入文件也必须先定义文件输入流对象。

定义文件输出流对象

方法1:先定义文件对象,然后调用open函数打开文件,与指定文件建立关联。例如

  ifstream infile;  //建立文件输入流对象 

  inflie.open("datal.txt",ios::in); 

方法2:在定义文件输入流对象时初始化,打开相关联的文件。例如

  ifstream infile("data1.txt",ios::in); 

输入流常用成员函数

Get()

该函数有以下三种主要使用形式:

   输入流对象名.get()

    这种形式的get函数是从输入流中获取一个字符(包括空白符)作为函数值。所谓空白符指的是空格符、制表符、换行符以及转义字符’\r’、’\t’、’\f’、’\n’、’\v’。

   输入流对象名.get(char &c)

这种形式的get函数也是从输入流中获取一个字符(包括空白符),并存放在变量c中。

输入流对象名.get(char *s,int n,int Delim=\n)

    这种形式的get函数是从输入流中最多获取n个字符(包括空白符),并存放在数组s,缺省结束符为换行符,且自动将换行符转换为字符串结束标志符插入到字符串尾。该函数返回当前输入流对象。

    此函数的结束条件除了上面提到的已读入n个字符、遇到换行符或指定结束符外,当遇到流输入结束符ctrl+z(EOF)时也结束(UNIX中为Ctrl+d)

Getline()

输入流对象名. getline(char *buf,int n,char Delim=\n)

    该函数最多获取n个字符并存入字符指针buf所指向的存储区中,缺省结束符为换行符,且自动将换行符转换为字符串结束标志符插入到字符串尾。该函数返回当前输入流对象。 

    此函数的结束条件除了上面提到的已读入n-1个字符、遇到换行符或指定结束符外,当遇到流输入结束符ctrl+z(EOF)时也结束(UNIX中为Ctrl+d)。 

    可见getline()函数和类似的get()函数的功能基本相同。唯一的区别是getline会从输入流中删除输入流结束符,而get函数不删除结束符

Read()

输入流对象名. read(char *buf,int n) 

    该函数从输入流中读取n个字节(含换行符在内)或遇到输入流结束符(ctrl+z)时结束操作。读入后存入buf指针所指存储区,且不在字符串尾添加空字符(\0)。该函数返回当前输入流对象

Seekg()

Tellg()

 它们是设置文件流读指针和返回当前文件流读指针位置的函数。它们的用法与seekptellp函数相同

  输入流对象名.seekg(流中位置

  输入流对象名.seekg(偏移量,参照位置

  输入流对象名.tellg() 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值