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();

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

相关推荐
赔罪1 分钟前
C 语言变量说明符
c语言·开发语言·c++·学习·算法·objective-c
夫琅禾费米线7 分钟前
JavaScript 中的 Generator 函数及其方法
开发语言·前端·javascript
@小博的博客14 分钟前
C++初阶学习 第十二弹——stack与queue的介绍和使用
开发语言·数据结构·c++·学习
佑冰25 分钟前
C++ 矩阵旋转
数据结构·c++·算法·c
CYRUS STUDIO29 分钟前
编译 LLVM 源码,使用 Clion 调试 clang
c语言·c++·visual studio·clang·ndk·llvm·clion
St_Ludwig36 分钟前
C语言小撰特殊篇-assert断言函数
c语言·c++·后端·算法
PaLu-LI1 小时前
ORB-SLAM2源码学习:Initializer.cc:Initializer::Normalize地图初始化——坐标归一化
c++·opencv·学习·算法·ubuntu·计算机视觉
秋说1 小时前
【数据结构 | C++】部落
数据结构·c++·算法
techdashen1 小时前
Go与黑客(第四部分)
开发语言·后端·golang
宇宙大豹发1 小时前
【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)
开发语言·爬虫·python·学习·python爬虫·python代码·python使用