C++中的IO流操作

本文详细介绍了C++中的IO流,包括流的概念、流对象与文件操作,以及输出流、输入流的使用。重点讲解了如何使用ofstream和ifstream进行文件读写,涉及格式控制、精度设定、二进制文件输出和字符串输出。同时,提到了操纵符在格式化输出中的作用,如setw和setprecision。最后,概述了输入流的常用函数,如get、getline和read等。
摘要由CSDN通过智能技术生成

.IO流的概念及流类库结构
1、前言

当程序与外界环境进行信息交换时,存在两个对象:
一个是程序中的对象,另一个是文件对象。
其中文件对象可以是磁盘设备,也可以是外部设备,C++将输入输出设备当做文件处理。

流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。

2、流对象与文件操作

  1. 程序建立一个流对象;
  2. 指定这个流对象与某个文件对象建立连接
  3. 程序操作流对象
  4. 流对象通过文件系统对所连接的文件对象产生作用

3、c++中的流对象
在这里插入图片描述
.输出流
1、预先定义的输出流对象

cout 标准输出,通常输出正常输出东西
cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出。
clog 类似于cerr,但是有缓冲,当缓冲区满是被输出

三个不同的输出流对象往往用于处理不同的信息,处理输出设备不同的信息

2、构造输出流对象

ofstream类支持磁盘文件输出
如果在构造函数中指定一个文件名,当构造这个文件时该文件是自动打开的
  .ofstream myFile("filename");
可以在调用默认构造函数之后使用open成员函数打开文件
  .ofsteam myFile;//声明一个静态文件输出流对象
  .myFile.open("filename");//打开文件,使流对象与文件建立联系
在构造对象或用open打开文件时可以指定模式
  .ofstream myFile("filename",ios_base::out|ios_base::binary);//以二进制模式打开某文件

文件输出流成员函数的三种类型
.与操作符等价的成员函数
.执行非格式化写操作的成员函数
.其它修改状态且不同于操作符或插入运算符的成员函数

3、常用的文件输出流成员函数

open函数
  .把流与一个指定的磁盘文件关联起来;
  .需要指定的打开模式
put函数
  .把一个字符写到输出流中
write函数
  .将内存中的一块内容写到一个文件输出流中
seekp和tell函数
  .操作文件流的内部指针
  .seekp可以移动文件内部的写指针
close函数
  .关闭与一个文件输出流关联的磁盘文件
错误处理函数
  .在写到一个流时进行错误处理

向文本文件输出

通常使用插入运算符“<<”
为所有标准c++数据类型预先设计的,用于传送字节到每一个输出流对象。

1、控制输出格式——操纵符(manipulator)

1)、插入运算符与操纵符一起工作
.控制输出格式
2)、很多操纵符都定义在

  • .ios_base类中(如hex())、头文件(如setprecison())。

3)、控制输出宽度
.在流中放入setw操纵符或调用width成员hs为每个项指定输出宽度.

  • .setw():https://blog.csdn.net/fzk0813/article/details/88303902

  • .width():https://blog.csdn.net/qq_41289920/article/details/82949660

  • .setiosflags操纵符
    .这个程序中,通过使用带参数的setiosflags操作符设置左对齐,setiosflags定义在头文件iomanip中
    .参数ios_base::left是ios_base的静态常量,因此引用时必须包括ios_base::前缀。
    .这里需要用resetiosflags操作符关闭左对齐标志。setiosflags不同于width和setw,它的影响是持久的,直到用resetiosflags重新恢复默认值时为止。
    .setiosflags的参数数该流的各是标志值,可用按位或(|)运算符进行组合

4)、setw和width仅影响紧随其后的输出项,但其它流格式操纵符保持有效直到发生改变
5)、dec、oct和hex操纵符设置输入和输出的默认进制。

2、精度——setprecision()
如果不指定fixed或scientific,精度值表示有效数字位数。
如果设置了ios_base::fixed或ios_base::scientific精度值表示小数点之后的位数

向二进制文件输出

1、二进制文件流

  1. 使用ofsteam构造函数中的模式参量指定二进制输出模式
  2. 以通常方式构造一个流,然后使用setmode成员函数,在文件打开后改变模式;
  3. 通过二级制文件输出流对象完成输出

例子:

#include <fstream>

using namespace std;

//c++中不支持对象的序列化,因此使用构造体,只含有数据结构体可被存储到磁盘。
struct Date
{
  int mon,day,year;
}

int main()
{
  Date dt={6,10,92};
  //建立文件输出流对象file,并与data.dat联系起来,且打开方式为二进制
  ofstram file("data.dat",ios_base::binary);
  file.write(reinterpret_cast<char*>(&dt),sizeof(dt));
  file.close();
  return 0;
}

向字符串输出

字符串输出流(ostringstream)
作用:用于构造字符串
功能:
1、支持ofstream类的除open、close外的所有操作
2、str函数可以返回当前已经构造的字符串
运用:
将数值转换为字符串

输入流
重要的输入流类:
1、istream类最适合用于顺序文本模式输入。cin是其实例
2、ifstream类支持磁盘文件输入
3、istringstream为字符串输入流类

1、构造输入流对象

1.如果在构造函数中指定一个文件名,在构造该对象时该文件便自动打开。
ifstream myFile("filename");
2、在调用默认构造函数之后使用open函数来打开文件。
ifstream myFile;//建立一个文件流对象
myFiile.open("filename");//打开文件“filename”
3、打开文件时可以指定模式
ifstream myFile("filename",ios_base::in|ios_base::binary);

使用提取运算符从文本文件输入——“>>”
1、提取运算符(<<)对于所有标准c++数据类型都是预先设计好的。
2、是从一个输入流对象获取字节最容易的方法。
3、ios类中的很多操纵符都可以应用于输入流。但是只有少数几个对输入流对象具有实际影响,其中最重要的是进制操纵符dec,oct和hex。

2、输入流相关函数

.open函数把该流与一个特定磁盘文件相关联。
.get函数的功能与提取运算符(>>)很相像,主要的不同点是get函数在读入数据时包括空白字符。
.getline的功能是从输入流中读取多个字符,并且允许指定输入终止符,读取完成后,从读取的内容中删除终止字符。
.read成员函数从一个文件读字节到一个指定的内存区域,由长度参数确定要读的字节数。当遇到文件结束或者在文本模式文件中遇到文件结束标记字符时结束读取。
seekg函数用来设置文件输入流中读取数据位置的指针。
tellg函数返回当前文件读指针的位置。
close函数关闭一个文件输入流关联的磁盘文件。
 一、ASCII 输出   为了使用下面的方法, 你必须包含头文件(译者注:在标准C++,已经使用取 代,所有的C++标准头文件都是无后缀的。)。这是 的一个扩展集, 提供有缓 冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个 文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O 操作。如果你猜是"fstream," 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用"ifstream"?和 "ofstream" 来作输入输出。   如果你用过标准控制台"cin"?和 "cout," 那现在的事情对你来说很简单。 我们现在开始讲输出部 分,首先声明一个类对象。 ofstream fout;   这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream::open()。 fout.open("output.txt");   你也可以把文件名作为构造参数来打开一个文件. ofstream fout("output.txt");   这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文 件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和"cout"的操 作很像。 对不了解控制台输出"cout"的人, 这里有个例子。 int num = 150; char name[] = "John Doe"; fout << "Here is a number: " << num << " "; fout << "Now here is a string: " << name << " ";   现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你 不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文 件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样: fout << flush; fout.close();    现在你用文本编辑器打开文件,内容看起来是这样:   Here is a number: 150 Now here is a string: John Doe   很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了操作,对 "<>" 比较熟悉了, 因为你接下来还要用到他们。继续…   二、ASCII 输入   输入和"cin" 很像. 和刚刚讨论的输出很像, 但你要考虑几件事情。在我们开始复杂的内容之前 , 先看一个文本:   12 GameDev 15.45 L This is really awesome!   为了打开这个文件,你必须创建一个in-stream对象,?像这样。 ifstream fin("input.txt");   现在读入前四行. 你还记得怎么用"<<" 操作符里插入变量和符号吧?好,?在 "<>" (提取) 操作符. 使用方法是一样的. 看这个代码片段.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值