C++IO类&文件输入输出

作者:tongqingliu

转载请注明出处:http://www.cnblogs.com/liutongqing/p/7072878.html


  1. istream(输入流)类型,提供输入操作。
  2. ostream(输出流)类型,提供输出操作。
  3. cin,一个istream对象,从标准输入读取数据。
  4. cout,一个ostream对象,向标准输出写入数据。
  5. cerr,一个ostream对象,通常用于输出程序错误消息,写入到标准错误。
  6. >>运算符,用来从一个istream对象读取输入数据。
  7. <<运算符,用来向一个ostream对象写入输出数据。
  8. getline函数,从一个给定的istream读取一行数据,存入一个给定的string对象中。
  • IO库类型和头文件
头文件               类型
iostream istream, wistream 从流读取数据
ostream, wostream 从流写入数据
iostream, wiostream 读写流
fstream ifstream, wifstream 从文件读写数据
ofstream, wofstream 向文件写入数据
fstream, wfstream 读写文件
sstream istringstream, wistringstream 从string读取数据
ostringstream, wostringstream 向string写入数据
stringstream, wstringstream 读写string

我们不能对IO对象进行拷贝和赋值,所以进行IO操作的函数通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const.

  • IO库条件状态

IO操作可能会出现错误,以下可以帮助我们访问和操纵流的条件状态。

strm::iostate        strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能
strm::badbit 用来指出流已崩溃
strm::failbit 用来指出一个IO操作失败了
strm::eofbit 用来指出流到达了文件结束
strm::goodbit 用来指出流未处于错误状态。此值保证为0
s.eof() 若流s的eofbit置位,则返回true
s.fail() 若流的failbit或badbit置位,则返回true
s.good() 若流s处于有效状态,则返回true
s.clear() 将流s中所有条件状态复位,将流的状态设置为有效。返回void
s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
s.setstate(flags) 根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
s.rdstate() 返回流s的当前条件状态,返回值类型为strm::iostate
  • 查询流的状态

将流作为条件使用,只能告诉我们流是否有效,但无法告诉我们具体发生了什么。

IO库定义了4个iostream类型的constexpr值,表示特定的位模式。这些值用来表示特定类型的IO条件,可以与位运算符一起使用来一次性检测或设置多个标志位。

badbit表示系统级错误,如不可恢复的读写错误。通常情况下,一旦badbit被置位,流就无法再使用了。在发生可恢复错误后,failbit被置位,如期望读取数值却读取了字符等错误。这种问题通常是可以修正的,流还可以继续使用。如果到达文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,表示流还未发生错误。如果badbit、failbit和eofbit任一个被置位,则检测流状态的条件就会失败。

标准库还定义了一组函数来查询这些标志位的状态。操作good在所有错误位均未置位的情况下返回true,而bad,fail和eof则在对应错误位被置位时返回true。此外,在badbit被置位时,fail也会返回true。这意味着,使用good或fail是确定流的总体状态的正确方法。实际上,我们将流当条件使用的代码就等价于!fail()。而eof和bad操作只能表示特定的错误。

  • fstream特有的操作
fstream fstrm;    			创建一个未绑定的文件流
fstream fstrm(s); 创建一个fstream,并打开名为s的文件
fstream fstrm(s, mode); 同上,只不过是以mode模式打开
fstrm.open(s); 打开名为s的文件,并将其与fstrm绑定。返回void
fstrm.close(); 关闭与fstrm绑定的文件。返回void(PS:当一个fstream对象被销毁时,close会自动被调用)
fstrm.is_open(); 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
  • 文件模式
in 		以读的方式打开
out 以写的方式打开
app 每次操作前均定位到文件末尾
ate 打开文件后立即定位到文件末尾
trunc 截断文件
binary 以二进制方式进行IO

以out模式打开的文件会丢弃已有数据

示例

demo

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
// 写入文件
ofstream outfile("test.txt");
outfile << "hello world!";
outfile.close();
/*
新建one.txt:
one
one
one
*/
// 读取文件
string file("one.txt");
ifstream infile(file.c_str());
/*
或者
ifstream infile("one.txt");
*/
if (!infile)
{
cerr << "error: unable to open input file:" << file << endl;
return -1;
}
string s;
while (infile >> s)
cout << s << endl;
infile.close(); system("pause");
return 0;
}

程序输出结果:

one
one
one
请按任意键继续. . .

还有一个test.txt

C++primer[5]

C++IO类&文件输入输出的更多相关文章

  1. IO库----IO类,文件输入输出,string流

    一.IO类 1.IO库类型和头文件表: 头文件 类型 iostream istream,wistream 从流读取数据 ostream,wostream 向流写入数据 iostream,wiostre ...

  2. -1-4 java io java流 常用流 分类 File类 文件 字节流 字符流 缓冲流 内存操作流 合并序列流

      File类 •文件和目录路径名的抽象表示形式 构造方法 •public File(String pathname) •public File(String parent,Stringchild) ...

  3. 8 . IO类-标准IO、文件IO、stringIO

    8.1 IO类 #include <iostream> //标准IO头文件  8.2 文件输入输出流 #include <fstream> //读写文件头文件 std::fst ...

  4. IO相关2(文件输入输出)

    除了继承自 iostream 类型的行为之外,fstream 中定义的类型还增加了一些新的成员来管理与流相关的文件.我们可以对 fstream,ifstream 和 ofstream 对象调用这些操作 ...

  5. C++的那些事:流与IO类

    1.流的概念 "流"就是"流动",是物质从一处向另一处流动的过程,比如我们能感知到的水流.C++的流是指信息从外部输入设备(如键盘和磁盘)向计算机内部(即内存) ...

  6. Python StringIO与BytesIO、类文件对象

    StringIO与BytesIO StringIO与BytesIO.类文件对象的用途,应用场景,优.缺点. StringIO StringIO 是io 模块中的类,在内存中开辟的一个文本模式的buff ...

  7. C++ Primer 笔记——IO类

    1.C++语言并未定义任何输入输出语句,取而代之,包含了一个全面的标准库来提供IO机制. 由上图能够知道,I/O操作的基类是ios_base,各个类的用途例如以下: <iostream> ...

  8. 第8章 IO类

    8.1 IO类 iostream                    istream, wistream从流中读取数据 ostream, wostream iostream, wiostream读写 ...

  9. [工具类]文件或文件夹xx已存在,则重命名为xx(n)(2)

    写在前面 最近一直在弄文件传输组件,其中一个功能就是,在接收端接收文件时,如果文件已经存在了,则对其进行文件名+索引的方式进行自动重命名,之前也写个类似的工具类,总感觉代码太冗余,每回头想想,总觉得心 ...

随机推荐

  1. VS2010 常见错误类型汇总

    开发路漫漫,尤其对于刚从事开发不久的新手来说,常常遇到一些稀奇古怪的错误,很是头疼,鉴于自己在开发过程中常遇到的几个错误做个分享,希望对大家有所帮助: 错误1: 在创建完win32的DLL后,编译时出 ...

  2. 浅谈odoo 后台与前端文件(附件)的存储与下载

    odoo 后台与前端文件(附件)存储与下载实现 笔记太多了很乱,想想还是写博客的好,慢慢更 当然了,前提是你已经配好了odoo开发环境 一.odoo后台界面实现附件的上传和下载 1).在应用中搜索下图 ...

  3. Mybatis Dynamic Query 2.0 入门

    简介 2.0 昨天打包好了,主要是整合了tk.mybatis.mapper 到项目中去,所以和1.x比起来主要多了一个通用mapper.因为作者主要是使用springboot 这里讲一下Springb ...

  4. MySQL学习进阶

    存储引擎 MyISAMMySQL 5.0 之前的默认数据库引擎,最为常用.拥有较高的插入,查询速度,但不支持事务 InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5. ...

  5. 吃奶酪 洛谷 p1433

    题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入输出格式 输入格式: 第一行一个数n (n<=15) 接下来每行2个实数,表示第i块 ...

  6. FPS手游如何脱颖而出?看《CF手游》的性能突破之路

    WeTest导读 俗话说:用户体验不谈性能就是耍流氓. 在PC游戏上的性能问题并没有那么明显, 加个内存换个CPU或者刷个主频就能轻松搞定:到了手游时代后情况则显得比较严峻,捉襟见肘的内存使得资源加载 ...

  7. mysql 中的socket 即 mysql.sock的作用

    这个mysql.sock应该是mysql的主机和客户机在同一host上的时候,使用unix domain socket做为通讯协议的载体,它比tcp快.通常遇到这个问题的原因就是你的mysql ser ...

  8. Mac OSX中的@executable_path, @load_path和@rpath的理解(网摘)

    Mac OSX中的@executable_path, @load_path和@rpath的理解 原文出处:[24K纯开源] Note: this article is actually about t ...

  9. Python第八天——Json

    json 模块 json 模块提供了非常完善的 Python 对象到 JSON 格式的转换 import json d = dict(name='Bob',age=20,score=88) json. ...

  10. 再起航,我的学习笔记之JavaScript设计模式13(装饰者模式)

    装饰者模式 装饰者模式(Decorator): 在不改变原对象的基础上,通过对其进行过包装拓展(添加属性高或者方法)使原有对象可以满足用户的更复杂需求. 如果现在我们有个需求,需要做一个提交表单,当我 ...