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[];
fin>>buf;//从文件中读取一个单词
fin.getline(buf,);//从文件中读取一行
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();
}
cout<<"输入密码:";
float secret;
cin>>secret;
fout<<secret<<endl;
fout.close(); ifstream fin(filename.c_str());
if(!fin.is_open())
{
cerr<<"无法打开文件 "<<filename<<endl;
exit();
}
cout<<"输入的密码为:\n";
char ch;
while(fin.get(ch))
cout<<ch;
fin.close();
return ;
}
程序中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=;
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 = ;
if(finout.is_open())
{
finout.seekg();
cout<<"contents of file "<<file<<endl;
while(finout.read((char *)&pl,sizeof pl))
{
cout<<ct++<<":"<<setw()<<pl.name<<":"
<<setprecision()<<setw()<<pl.population
<<setprecision()<<setw()<<pl.g<<endl;
}
if(finout.eof())
finout.clear();
else{
cerr<<"无法打开文件 "<<file<<endl;
exit();
}
}
else{
cerr<<"无法打开文件 "<<file<<endl;
exit();
}
cout<<"enter record number to change:";
long rec;
cin>>rec;
eatline();
if(rec<||rec>=ct)
{
cerr<<"无效 index number"<<endl;
exit();
}
streampos place = rec*sizeof pl;
finout.seekg(place);
if(finout.fail())
{
cerr<<"无法找到 index number"<<endl;
exit();
}
finout.read((char *)&pl,sizeof pl);
cout<<"找到的 index number"<<endl;
cout<<rec<<":"<<setw()<<pl.name<<":"
<<setprecision()<<setw()<<pl.population
<<setprecision()<<setw()<<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();
} ct = ;
finout.seekg();
cout<<"contents of file "<<file<<endl;
while(finout.read((char *)&pl,sizeof pl))
{
cout<<ct++<<":"<<setw()<<pl.name<<":"
<<setprecision()<<setw()<<pl.population
<<setprecision()<<setw()<<pl.g<<endl;
}
finout.close();
cout<<"Done.\n";
return ;
}
程序中,我们使用了一个特别的流管理对象fstream,
fstream继承子iostream,而iostream继承自istream和ostream
因此fstream继承了两个缓冲区,一个用于输入,一个用于输出
并能同步化两个缓冲区的处理。即输入指针和输出指针的位置始终相同。
这样用一个流管理对象,就可以同时进行读和写。
参考资料:《C++ Primer.Plus》 pp.768-788
C++文件输入和输出的更多相关文章
- C C++ 文件输入与输出
C语言: 一 打开关闭文件 1 fopen函数 用于打开文件 FILE *fopen(char *filename, *type); fopen("c:\\ccdos\\clib" ...
- python文件输入和输出
1.1文件对象 文件只是连续的字节序列.数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成.1.2文件内建函数open()和file() 内建函数open()的基本语法是: file_ ...
- 网易云课堂_C++程序设计入门(下)_第7单元:出入虽同趣,所向各有宜 – 文件输入和输出_第7单元 - 作业2:编程互评
第7单元 - 作业2:编程互评 查看帮助 返回 提交作业(剩余10天) 完成并提交作业 作业批改 互评训练 互评作业 自评作业 成绩公布 查看成绩 由于在线编程不支持 ...
- Numpy 用于数组的文件输入和输出
将数组以二进制格式保存 np.save 和np.load 是读写磁盘数组数据的两个主要函数.默认情况下,数组是以未压缩的原始二进制格式进行保持在扩展名 为.npy的文件中的 如果文件路径末尾没有扩展名 ...
- C++——输入、输出和文件
一.C++输入和输出概述 1.1.流和缓冲区 C++程序把输入和输出看作字节流.输入时,程序从输入流中抽取字节:输出时,程序将字节插入到输出流中.对于面相文本的程序,每个字节代表一个字符,更通俗地说, ...
- C++_IO与文件5-文件的输入与输出
大多数计算机程序都使用了文件.文件本身是存储在某种设备上的一系列字节. 通常,操作系统管理文件,跟踪它们的位置.大小.创建时间等. 除非在操作系统级别上编程,否则通常不必担心这些事情. 真正需要的是将 ...
- C++_IO与文件4-简单文件的输入与输出
通过键盘输入和屏幕输出被称为是控制台输入/输出: 更广义上讲控制台的输入/输出也是一种特殊的文件输入/输出: 当使用cin进行输入时,程序将输入视为一系列的字节,其中的每个字节都被解释成字符编码: 不 ...
- matlab学习笔记5--低级文件输入输出函数
一起来学matlab-matlab学习笔记5 低级文件输入输出函数 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张 ...
- python应用(7):输入与输出
如前文,流程是程序的主角,而流程一般都需要处理数据,那数据如何进到流程,而最终处理后的数据又如何表现,这就是流程的输入与输出的问题. 本文介绍流程处理的数据的输入与输出. 流程中的输入,一般都会先保存 ...
随机推荐
- redis补充和rabbitmq讲解
线程池: redis发布订阅: rabbitMQ: MySQL; python pymysql: python orm SQLAchemy: paramiko: 堡垒机: 1.线程池 1.1 cont ...
- Linux命令(1)-创建文件
版本:centos7 1.可以使用cat创建一个新的文件 命令:cat>>filename 使用cat创建文件时,以系统默认的文件属性作为新文件的属性,并接受键盘输入作为文件的内容.输入结 ...
- Candy Distribution_找规律
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6012 Accepted: 3341 Description N chi ...
- Java 集合深入理解(10):Deque 双端队列
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 什么是 Deque Deque 是 Double ended queue (双端队列) 的缩写,读音和 deck 一样,蛋 ...
- dedecms织梦
dedecms的安装,其修改连接数据库文件是:common.inc.php
- 有趣的数-回文数(Palindrome number)
文章转自http://blog.163.com/hljmdjlln@126/blog/static/5473620620120412525181/ 做LC上的题"Palindrome num ...
- 二维数组的传输 (host <-> device)
前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMa ...
- 理解HMM
hidden markov model markov model: 把一个总随机过程看成一系列状态的不断转移, 其特性主要使用转移概率来表示. HMM:认为模型的状态是不可观测的(hidden), 能 ...
- html中的元素和节点
元素(Element)和结点(Node)的区别, 元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如<div>...</div>. 但是一个结点不一定是一个元素 ...
- Apache的https协议配置
一.http协议和https协议的传输格式 http:文本格式的协议 https:二进制格式的协议 二.x509.3证书格式: 证书格式的版本号 证书序列号 证书签名算法 证书颁发者 有效期 持有者的 ...