C++文件输入和输出
1.引入头文件fstream
fstream头文件定义了用于文件输入的类ifstream和文件输出的类ofstream
2.写文件
1)创建一个ofstream对象来管理输出流
2)将该对象与文件关联起来
3)使用cout方式使用该对象,唯一区别是输出将进入文件,而不是屏幕。
4)关闭到文件的连接
示例如下:
ofstream fout; fout.open("test.txt"); fout<<"write something"; fout.close();
创建对象和关联文件可使用构造函数合并到一步,以上代码等价于:
ofstream fout("test.txt"); fout<<"write something"; fout.close();
3.读文件
1)创建一个ifstream对象来管理输入流
2)将该对象与文件关联起来
3)使用ifstream的方法读文件
4)关闭到文件的连接
示例如下:
ifstream fin("test.txt"); char ch; fin>>ch;//从文件中读取一个字符 char buf[80]; fin>>buf;//从文件中读取一个单词 fin.getline(buf,80);//从文件中读取一行 string line; getline(fin,line);//读取一行转换成字符串 fin.close();
4.读写缓冲区
fstream流管理对象在使用cout或cin方式,读或写时,是通过缓冲区和文件进行交互的,
而不是逐字节读取或写入文件的。
关于close()函数,当流对象过期(如程序终止)时,到文件的连接自动关闭,
也可使用cose()显示关闭该连接。连接关闭后,将刷新缓冲区。
与文件的连接关闭后,并不会删除流,fstream流对象和它管理的缓冲区仍然存在,
可以将流重新连接到文件。
5.一个简单的读写文件示例
#include<iostream> #include<fstream> #include<string> using namespace std; const string filename="test.txt"; int main() { ofstream fout(filename.c_str()); if(!fout.is_open()) { cerr<<"无法打开文件 "<<filename<<endl; exit(0); } cout<<"输入密码:"; float secret; cin>>secret; fout<<secret<<endl; fout.close();ifstream fin(filename.c_str()); if(!fin.is_open()) { cerr<<"无法打开文件 "<<filename<<endl; exit(0); } cout<<"输入的密码为:\n"; char ch; while(fin.get(ch)) cout<<ch; fin.close(); return 0; }
程序中is_open()函数,是用来检查文件是否被打开
流对象的状态包括:
一切顺利,已达到文件尾,I/O操作失败等。如果一切顺利,流状态设置为0,否则设置为1。
6.打开多个文件
1)需要同时打开多个文件,则需要为每个文件创建一个流。
2)需要依次打开一组文件,可以只打开一个流,将它依次关联到各个文件。
如下例所示:
ifstream fin; fin.open("test.txt"); fin.close(); fin.clear(); fin.open("test2.txt"); fin.close();
7.文件模式
常量 | 含义 |
ios_base::in | 打开文件,以便读取 |
ios_base::out | 打开文件,以便写入 |
ios_base::ate | 打开文件,并移到文件尾,和ios_base::app的区别是,后者只能在文件尾写入,前者只是将写入指针初始化在文件尾 |
ios_base::app | 追加到文件尾 |
ios_base::trunc | 如果文件存在,则清空文件内容 |
ios_base::binary | 二进制文件 |
对于ifstream open(),默认的模式为ios_base::in
对于ofstream open(),默认的模式为ios_base::out|ios_base::trunc,打开并清空文件
8.二进制模式 ios_base::binary
文件的存储类型有两种,文本格式或二进制格式。
文本格式便于读取,而二进制格式更加精确,占用空间小,读取速度快。
写操作:
fout.write((char*)&T,sizeof T);
读操作:
fin.read((char*)&T,sizeof T);
注意需要将类型实例地址,强制转换为char*类型。
9.随机存取
随机存取是指,读写指针直接移动到文件的任何位置。
跳转函数:
istream & seekg(streamoff,ios_base::seekdir);//相对地址 istream & seekg(streampos);//绝对地址
第一个方法的意思是,离seekdir参数指定文件位置,距离streamoff的位置。
其中,streamoff单位的是字节,seekdir表示文件的三个位置(顶端ios_base::beg,底端ios_base::end,当前位置ios_base::cur)
第二个方法的意思是,离文件开头streampos的位置
streampos表示文件中的绝对位置,单位是字节
seekg()
移到文件开头
tellg()
返回读写指针当前的位置
下面,我们用二进制文件模式,写一个简单的随机存取示例:
#include<iostream> #include<fstream> #include<iomanip> const int LIM=20; struct planet {char name[LIM];double population;double g; }; const char *file = "planets.dat"; inline void eatline(){while(std::cin.get()!='\n') continue;} int main() {using namespace std;planet pl;cout<<fixed;fstream finout;finout.open(file,ios_base::in|ios_base::out|ios_base::binary);int ct = 0;if(finout.is_open()){finout.seekg(0);cout<<"contents of file "<<file<<endl;while(finout.read((char *)&pl,sizeof pl)){cout<<ct++<<":"<<setw(20)<<pl.name<<":"<<setprecision(0)<<setw(12)<<pl.population<<setprecision(2)<<setw(6)<<pl.g<<endl;}if(finout.eof())finout.clear();else{cerr<<"无法打开文件 "<<file<<endl;exit(0);}}else{cerr<<"无法打开文件 "<<file<<endl;exit(0);}cout<<"enter record number to change:";long rec;cin>>rec;eatline();if(rec<0||rec>=ct){cerr<<"无效 index number"<<endl;exit(0);}streampos place = rec*sizeof pl;finout.seekg(place);if(finout.fail()){cerr<<"无法找到 index number"<<endl;exit(0);}finout.read((char *)&pl,sizeof pl);cout<<"找到的 index number"<<endl;cout<<rec<<":"<<setw(20)<<pl.name<<":"<<setprecision(0)<<setw(12)<<pl.population<<setprecision(2)<<setw(6)<<pl.g<<endl;if(finout.eof())finout.clear();cout<<"输入name:";cin.get(pl.name,LIM);eatline();cout<<"population:";cin>>pl.population;cout<<"g:";cin>>pl.g;finout.seekp(place);finout.write((char*)&pl,sizeof pl)<<flush;if(finout.fail()){cerr<<"写失败 index number"<<endl;exit(0);}ct = 0;finout.seekg(0);cout<<"contents of file "<<file<<endl;while(finout.read((char *)&pl,sizeof pl)){cout<<ct++<<":"<<setw(20)<<pl.name<<":"<<setprecision(0)<<setw(12)<<pl.population<<setprecision(2)<<setw(6)<<pl.g<<endl;}finout.close();cout<<"Done.\n";return 0; }
程序中,我们使用了一个特别的流管理对象fstream,
fstream继承子iostream,而iostream继承自istream和ostream
因此fstream继承了两个缓冲区,一个用于输入,一个用于输出
并能同步化两个缓冲区的处理。即输入指针和输出指针的位置始终相同。
这样用一个流管理对象,就可以同时进行读和写。
参考资料:《C++ Primer.Plus》 pp.768-788
C++文件输入和输出相关推荐
- OpenCV XML和YAML文件的文件输入和输出
OpenCV XML和YAML文件的文件输入和输出 XML和YAML文件的文件输入和输出 目标 源代码 解释 XML / YAML文件打开和关闭. 文本和数字的输入和输出. OpenCV数据结构的输入 ...
- 《Python参考手册(第4版•修订版)》——1.4 文件输入和输出
本节书摘来自异步社区<Python参考手册(第4版•修订版)>一书中的第1章,第1.4节,作者David M. Beazley,更多章节内容可以访问云栖社区"异步社区" ...
- C++ Primer 第五版 第8章类 8.2——文件输入和输出
目录 8.2 文件输入和输出 fstream头文件 fstream特有的操作 输出文件(写入文件) 输入文件(读取文件) 成员函数open和close 流状态检查和is_open() 文件模式 程序实 ...
- C++ 文件输入和输出fout fin
最近在写C++程序,好久没有用C++,之前学的的一些函数都记不太得了.买了一本<C++ Primer Plus>中文版,看了其中关于文件输入和输出的章节,发现了一些以前没有学过的函数,很有 ...
- python文件输入和输出
第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不能读出.w+可读写) w+与r+区别: r+:可读可写,若文件不存在,报错 ...
- yamlcpp遍历_OpenCV文件输入和输出使用XML和YAML文件
目标 您会找到以下问题的答案:如何使用YAML或XML文件打印和读取文本和OpenCV文本条目? OpenCV数据结构如何做同样的操作? 如何为您的数据结构做这个? 源代码 您可以从这里下载,也可以在 ...
- C C++ 文件输入与输出
C语言: 一 打开关闭文件 1 fopen函数 用于打开文件 FILE *fopen(char *filename, *type); fopen("c:\\ccdos\\clib" ...
- 「Python|输入输出」如何进行用户输入、文件输入和输出
本文主要介绍Python中如何让用户进行内容输入,如何从文件中读取数据作为输入以及如何将数据保存到文件中 文章目录 如何让用户进行内容输入 如何从文件中获取数据到程序(内存)中 如何将程序数据存储到文 ...
- verilog 中文件输入/输出任务(转)(注:在modelsim里面仿真)
http://linzhjbtx.blog.163.com/blog/static/925067402012269036943/ 系统函数$fopen用于打开一个文件,并还回一个整数指针.然后,$fd ...
最新文章
- 初学者必学的C++项目!花3天搞定
- 【1024】不整虚的,红包以备,致敬一线同僚!
- request如何setParamter
- spark.mllib:NaiveBayes
- 最新数据:中国网民超10亿,中老年群体增速最快
- IOS VFL语言(页面布局)
- 大型企业通用ERP进销存源码 ASP.Net开发系统源码
- 安装ubuntu20.04,从格式化磁盘到搭建全栈开发环境
- codeforces1359E Modular Stability
- C# WPF新版开源控件库:Newbeecoder.UI
- Mac 下使用apt-get
- laravel 模型局部不更新updated_at字段
- 18本生物竞赛辅导书
- TCGA_改版后STAR-count处理方法
- 将idea中文显示转化成英文
- 对程序员而言,有什么终身受用的底层知识?
- html canvas 开发工具,基于js的html canvas工具包:cantool
- JDBC连接Sql_Server_2005
- 纽约大学计算机专业研究生学费,纽约大学学费_纽约大学研究生留学费用
- 用计算机处理图像属于啥技术,计算机图像处理技术