开发者社区> 楚兴> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C++文件操作

简介: 1、文件操作类 fstream: 可同时读写操作的文件类(由iostream引申而来) ofstream: 写操作(输出)的文件类(由ostream引申而来) ifstream: 读文件(输入)的文件类(由istream引申而来) (文件类的实质,解释的很好) 对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被
+关注继续查看

1、文件操作类

fstream: 可同时读写操作的文件类(由iostream引申而来)

ofstream: 写操作(输出)的文件类(由ostream引申而来)

ifstream: 读文件(输入)的文件类(由istream引申而来)

(文件类的实质,解释的很好)

对这些类的一个对象所做的第一个操作通常就是将它和一个真正的文件联系起来,也就是说打开一个文件。被打开的文件在程序中由一个流对象(stream object)来表示(这些类的实例),而这个流对象所做的任何输入输出操作实际上就是对该文件所做的操作。

 

2、打开文件:

(1)使用流对象的open()函数打开文件,默认以写方式打开文件时,文件不存在则创建,而以读打开时不存在则打开不成功。文件打开时默认是以兼容共享模式。如:


void open (const char * filename, openmode mode);
mode是以下标志符的一个组合:
文件打开方式选项  
ios::in = 0x01 为输入(读)而打开文件
ios::out = 0x02 为输出(而)而打开文件
ios::ate = 0x04 初始位置:文件尾,但是以输出方式打开时,也是存在文件则先删除。
ios::app = 0x08 所有输出附加在文件末尾,即使定位指针也是附加在文件末尾。
ios::trunc = 0x10 如果文件已存在则先删除该文件
ios::binar = 0x80 二进制方式
文件保护方式选项 用在缓存文件中
filebuf::openprot 默认的兼容共享方式
filebuf::sh_none 独占,不共享
filebuf::sh_read 读共享
filebuf::sh_write 写共享

这些标志符可以被组合使用,中间以“或”操作符“|”间隔。例如,我们想以二进制方式打开文件“example.bin”来写入一些数据,我们可以通过以下方式调用成员函数open()来实现


ofstream file;
file.open("example.bin", ios::out | ios::app | ios::binary);

ofstream, ifstream和fstream所有这些类的成员函数open都包含了一个默认打开文件的方式,这三个类的默认方式各不相同:

参数的默认方式
fstream ios::in | ios::out
ifstream ios::in
ofstream ios::out | ios::trunc

只有当函数被调用而没有声明mode的情况下,默认值才会被采用。如果函数调用时声明了任何参数,默认值将被完全改写,而不会与调用参数组合。(自己应该养成声明mode的习惯)

(2)构造函数打开文件

对上面打开文件example.bin文件的方式改写


ofstream file ("example.bin", ios::out | ios::app | ios::binary);
两种打开文件的方式都是正确的。

(3)检测打开是否成功

使用“is_open()”成员函数来检测是否顺利打开,它返回一个bool值,“true”代表顺利打开,“false”代表打开失败。

 

3、关闭文件

当文件读写完成之后,必须将文件关闭以使其重新变为可访问的。关闭文件需要调用“close()”函数,它负责将缓存中数据释放出来并关闭文件。

这个函数一旦调用,原先的流对象就可以被用来打开其他的文件了,打开其他文件时,一定要先用clear()函数来将流对象的指针等标志位数据重新初始化。

如果文件不存在时,这时候不止调用open会出错,调用close也会出错。

为了防止流对象被销毁时还联系着打开的文件,析构函数(destructor)将会自动调用关闭函数close()。

 

4、读写文件

(1)文本文件(Text mode files)

类ofstream, ifstream和fstream分别从ostream,istream和iostream中引申而来,这就是为什么fstream的对象可以使用其父类的成员来访问数据。

我们使用重载的“<<”和“>>”来“输入”和“输出”,如


 // writing on a text file       file example.txt
    #include <fiostream.h>
    
    int main () {
        ofstream examplefile ("example.txt");
        if (examplefile.is_open()) {

examplefile << "This is a line.\n"; // 写入文件时,如果定位了指针,默认是覆盖已有的文件内容,

// 而不会将已有的内容后移。

            examplefile << "This is another line.\n";
            examplefile.close();
        }
        return 0;
    }
(2)二进制文件
 
5、检测EOF
成员函数eof()用来检测是否到达文件尾:
到达文件尾 返回非0值
未到达文件尾 返回0
 
6、获取和设置流指针(get and put stream pointers)
所有的输入/输出流对象都至少有一个流指针:
ifstream get pointer,指向下一个将被读取的元素
ofstream put pointer,指向下一个将写入的位置
fstream 同时继承get和put
我们可以使用以下成员函数来读出和配置这些指向流中读写位置的流指针:
streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值
ifstream  
tellg() 返回pos_type类型的值,根据(ANSI-C++标准),是一个整数,代表当前的指针位置
seekg ( off_type offset, seekdir direction ) 根据direction的初始位置移动offset个位置
ofstream  
tellp() 同tellg()
seekp ( off_type offset, seekdir direction ); 同seekg
direction的值可以是以下三种中的一个:
ios::beg 从流开始的位置
ios::cur 从流指针当前的位置
ios::end 从流末尾的位置

由于文本文件中某些特殊字符可能被修改,所有这些函数一般用于二进制文件中。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
文件的行操作
1.1 第8题 输出test.txt文件内容时,不包含clsn字符串的命令 文件内容: [root@znix ~]# cat /data/test.txt test liyao clsn 1.1.1 方法一grep 使用grep命令,找什么就写什么 -v 参数是排除的意思 [root@znix ~]# grep -v "clsn" /data/test.txt test liyao 1.1.2 方法二head 使用head显示文件前2行信息(-2参数是显示两行),默认显示前10行。
862 0
C++文件操作初体验
【摘要】学习是可以基于需求的,其必要性超了另外一种观点:按课本的顺序学。本文介绍了在C++中使用文件的最基本的方法,并试图通过给出的练习,使C++初学者能够对实际项目中输入输出中使用更广泛的“文件”有所认识,并学会初步的操作。本文适合于仅掌握了一般数据类型与控制结构的读者。  你一定不满足程序处理完的数据,然后只在屏幕上显示一下的方式。如果处理的结果能够永久地保存下来多好!  你一定厌倦了要让
1096 0
C# 文件操作
c#文件操作   在.NET Framework中进行的所有的输入和输出工作都要使用到流。流是串行化设备的抽象串行化设备可以以线性方式存储数据,并可以以同样的方式访问:一次访问—个字节。此设备可以是磁盘文件、打印机、内存位置和或任何其他支持以线性方式读写的对象。
651 0
+关注
楚兴
达则兼济天下,穷则独善其身。
344
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载