C++文件操作

本文详细介绍了C++中文件操作的关键概念,包括文本文件和二进制文件的区别,以及ofstream、ifstream和fstream的使用方法。讲解了文件位置指针、缓冲区和流状态的概念及其在实际编程中的应用。
摘要由CSDN通过智能技术生成

程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放

通过文本可以将数据持久化

C++对文件操作需要包含头文件 <fstream>

文件类型分为两种:
1、文本文件:文件以文本的ASCII码形式存储在计算机
2、二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂

操作文件的三大类:
1、ofstream 写 output
2、ifstream 读 input
3、fstream 读写

在这里插入图片描述

文本文件

写文件

步骤

  1. 包含头文件 <fstream>
  2. 创建流对象 ofstream ofs;
  3. 打开文件 ofs.open("文件路径",打开方式);
  4. 写数据 ofs<<"写入数据";
  5. 关闭文件 ofs.close();
#include <iostream>
#include <fstream>

int main() {
    //    std::ofstream outfile("../data.txt");
    //或者
    std::ofstream outfile;
    outfile.open("../data.txt",std::ios::out);
    //实际开发要判断 is_open 打开文件是否成功
    int data = 42;
    outfile << "Hello World!" << std::endl;
    outfile << data << std::endl;
    outfile.close();
    return 0;
}

在这里插入图片描述
注意:文件打开方式可以配合使用,利用|操作符

​ 例如: 用二进制方式写文件 ios::binary | ios::out

读文件

步骤

  1. 包含头文件 <fstream>
  2. 创建流对象 ifstream ifs;
  3. 打开文件并判断文件是否打开成功 ifs.open("文件路径",打开方式);
  4. 读数据 四种方式读取
  5. 关闭文件 ifs.close();
  std::ifstream ifs;
    ifs.open("../data.txt",std::ios::in);

    //是否打开成功
    if (ifs.is_open()){
        //读数据
        //第一种
//        char buf[1024]={0};
//        while (ifs>>buf){
//            std::cout<<buf<<std::endl;
//        }

        //第二种
//        char buf[1024] = {0};
//        while (ifs.getline(buf,sizeof(buf))){
//            std::cout<<buf<<std::endl;
//        }

        //第三种
//        std::string buf;
//        //第一个是文件流,第二个是存储的字符串
//        while (std::getline(ifs,buf)){
//            std::cout<<buf<<std::endl;
//        }

        //第四种  不推荐 是一个字符一个字符的读入
//        char c;
//        while ((c=ifs.get())!= EOF){
//            std::cout<<c;
//        }

        ifs.close();
    } else{
        std::cout<<"open fail"<<std::endl;
    }

二进制文件

以二进制的方式对文件进行读写操作
打开方式要是 ios::binary

写文件

二进制方式写文件主要利用流对象调用成员函数write

函数原型:ostream &write(const char *buffer,int len)

参数解释:字符指针buffer指向内存中一段存储空间,len是读写的字节数

    std::ofstream ofs;
    ofs.open("../person.txt",std::ios::out|std::ios::binary);

    Person p = {"duyun",20};
    //强制类型转化      长度
    ofs.write((const char*)&p, sizeof(Person));

    ofs.close();

读文件

进制方式读文件主要利用流对象调用成员函数read

函数原型::istream& read(char *buffer,int len);

参数解释:字符指针buffer指向内存中一段存储空间。len是读写的字节数

    std::ifstream ifs;
    ifs.open("../person.txt",std::ios::in|std::ios::binary);
    Person p;
    if (ifs.is_open()){
        ifs.read((char *)&p, sizeof(Person));
        std::cout<<p.name<<p.age<<std::endl;
        ifs.close();
    }

文件位置指针

对文件进行读/写操作时,文件的位置指针指向当前文件读/写的位置。
不管用哪个类操作文件,文件的位置指针只有一个

获取文件位置指针

ofstreamtellp()

ifstreamtellg()

fstream:有两个函数,但是获取的文件位置指针地址是一样的

移动文件位置指针

ofstream 类的函数是 seekp();
ifstream 类的函数是 seekg();
fstream 类两个都有,效果相同
在这里插入图片描述
在这里插入图片描述

缓冲区和流状态

缓冲区

缓冲区可以减少磁盘读写的次数,提高读写的效率

在C++中,每打开一个文件系统就会分配一个缓冲区。不同的流,缓冲区是独立的

程序员只关心输出缓冲区就可以
(输出、输入是针对程序而言的)

在缺省模式下,输出缓冲区中的数据满了才把数据写入磁盘,但是缺省模式不一定满足业务,可以进行操作输出缓冲区

  • flush():刷新缓冲区,直接写入磁盘
  • endl:换行,并且刷新缓冲区
  • unitbuf:设置输出流,在每次操作之后自动刷新缓冲区 ofs<<unitbuf
  • nounitbuf:设置输出流,让输出流回到缺省模式ofs<<nounitbuf
    在这里插入图片描述

流状态

流状态有三个:eofbit、badbit、failbit 取值为1/0

当三个流状态全为0,表示一切顺利,good成员函数返回true

1)eofbit
当输入流操作到达文件末尾时,将设置eofbit为1

eof()检查流eofbit

2)badbit
无法诊断的失败破坏流时,将设置 badbit。
(例如:对输入流进行写入;磁盘没有剩余空间)
bad()成员函数检查流是否设置了 badbit

3)failbit
当输入流操作未能读取预期的字符时,将设置failbit(非致命错误,可挽回,一般是软件错误,例想读取一个整数,但内容是一个字符串;文件到了未尾)I/0 失败也可能设置 failbit
fail()成员函数检查流是否设置了 failbit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值