C++——文件操作

在C++编程中,文件操作是一个重要的组成部分,它允许程序读取、写入和处理文件数据。为了执行文件操作,C++提供了一系列的类和函数,这些都包含在标准库的*<iostream>* 和*<fstream>*头文件中。


目录

一、I/O流

二、文本文件

1.写文件

2.写文件

三、二进制文件

1.二进制读写操作

四、C++的随机读写


一、I/O流

头文件 <fstream>

C++中把对文件的读写操作都封装在以下类中:

ofstream 对文件的写操作,继承了ostream类的功能

ifstream 对文件的读操作,继承了istream类的功能

fstream 对文件的读写操作,继承了ofstream\ifstream类的功能

二、文本文件

1.写文件

1.包含头文件 #include <fstream>

2.创建流对象 ofstream ofs;

3.打开文件 ofs.open("文件路径",打开方式);

打开方式:

ios::in 为读文件而打开文件

ios::out 为写文件而打开文件

ios::ate 初始位置:文件尾

ios::app 追加的方式写文件

ios::trunc 如果文件存在,先删除后创建

ios::binary 以二进制方式打开文件

文件打开方式可以配合使用,利用"|"操作符

4.写数据 ofs<<"要写入的数据";

5.关闭文件 ofs.close();

2.写文件

1.包含头文件 #include <fstream>

2.创建流对象 ifstream ifs;

3.打开文件并判断文件是否打开成功 ifs.open("文件路径",打开方式);

判断文件是否打开成功

a、使用 !类对象名 的方式进行判断

if(!ifs){}

else {}

b、使用 good\fail 成员函数进行判断上一次文件操作是否成功\失败 需要注意返回值

4.读数据

  1. 逐行读取:使用 getline

getline 可以逐行读取文本文件的内容,适合读取整行数据。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream inputFile("example.txt"); // 打开文件

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    string line;
    while (getline(inputFile, line)) {
        cout << line << endl; // 输出读取的每一行
    }

    inputFile.close(); // 关闭文件
    return 0;
}

CopyInsert

  1. 读取一个单词:使用 >> 操作符

可以使用 >> 操作符读取文件中的一个单词(以空格、换行等为分隔符)。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main() {
    ifstream inputFile("example.txt");

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    string word;
    while (inputFile >> word) { // 读取下一个单词
        cout << word << endl; // 输出读取的单词
    }

    inputFile.close();
    return 0;
}

CopyInsert

  1. 读取字符:使用 get 方法

可以使用 get 方法逐个读取字符。

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream inputFile("example.txt");

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    char ch;
    while (inputFile.get(ch)) { // 逐个读取字符
        cout << ch; // 输出读取的字符
    }

    inputFile.close();
    return 0;
}

CopyInsert

  1. 读取特定数量的字符:使用 read 方法

可以使用 read 方法指定读取特定数量的字符。

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ifstream inputFile("example.txt", ios::binary); // 以二进制模式打开文件

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    char buffer[256];
    while (inputFile.read(buffer, sizeof(buffer))) { // 每次读取256个字节
        cout.write(buffer, inputFile.gcount()); // 输出读取的字符
    }

    inputFile.close();
    return 0;
}

CopyInsert

  1. 使用 istreambuf_iterator 读取整个文件

可以通过 istreambuf_iterator 一次性读取整个文件。

#include <iostream>
#include <fstream>
#include <iterator>

using namespace std;

int main() {
    ifstream inputFile("example.txt");

    if (!inputFile.is_open()) {
        cout << "无法打开文件" << endl;
        return 1;
    }

    // 使用迭代器直接输出整个文件内容
    cout << std::istreambuf_iterator<char>(inputFile);
    
    inputFile.close();
    return 0;
}

三、二进制文件

二进制文件打开方式要指定为ios::binary

1.二进制读写操作

ostream &write(const char *buffer,streamsize num);

功能:以二进制方式写入文件

buffer:待写入数据的内存首地址

num:要写入的字节

注意:C++中文件I/O流的write只有两种结果,要么num个字节全部写入成功,要么一个都没有写入,只需要使用 good\fail 判断是否写入成功

istream &read( char *buffer, streamsize num );

功能:以二进制方式读文件

buffer:存储数据的内存首地址

num:要读取的字节数

streamsize gcount();

功能:获取上一次读文件操作时读到的字节数

注意:在以二进制方式读写对象时,对象的成员不应该有指针(以及string)类型,因为在写入时只会写入指针成员变量(地址编号),而下一次读取该指针变量时,该指针所指向的内存极大可能不是指向上次写入时的内存了,因此读到的该编号没意义了

四、C++的随机读写

C++为文件IO流提供了两套设置文件位置指针的成员函数,目的为了兼容有两个位置指针的操作系统,但是UNIX\Linux和Windows系统底层只有一个位置指针,所以使用哪套都可以

istream &seekg(off_type offset,ios::seekdir origin);

功能:通过偏移值+基础位置 设置 输入流位置指针的位置

offset:偏移量

origin:基础位置

ios::beg 文件开头

ios::cur 当前位置

ios::end 文件末尾

istream &seekg(pos_type position );

功能:通过 绝对位置 设置输入流位置指针的位置

ostream &seekp( off_type offset,ios::seekdir origin );

ostream &seekp( pos_type position );

功能与seekg类似,用哪个都可以

pos_type tellg();

功能:获取输入流的位置指针的位置

pos_type tellp();

功能:获取输出流的位置指针的位置

bool eof();

功能:判断文件的上一次读操作是否从文件末尾开始读,是返回真

相关推荐
尘浮生31 分钟前
Java项目实战II基于Spring Boot的智慧生活商城系统的设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·mysql·maven·生活
工作不忙1 小时前
关于SwitchCase中变量定义及使用变量的一些注意事项参数传递参数时不能实现多态动态绑定的问题c++语法
开发语言·c++·windows·开源·开源软件
安祝老师1 小时前
十四届蓝桥杯STEMA考试Python真题试卷第二套第二题
开发语言·python·算法·青少年编程·蓝桥杯
疯一样的码农2 小时前
Java初学者指南
java·开发语言
Shaun8882 小时前
Basic bash script tutorial
开发语言·bash
立黄昏粥可温2 小时前
Python 从入门到实战44(Pandas读写数据)
开发语言·python·pandas
cdut_suye3 小时前
Python编程探索:从基础语法到循环结构实践
开发语言·python·学习
片片叶3 小时前
C++(二)
c++
LUwantAC3 小时前
Java学习路线:JUL日志系统(一)日志框架介绍
java·开发语言·学习