「C/C++」C++标准库之#include<fstream>文件流

news/2024/11/2 1:26:49/

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「C/C++」C/C++程序设计
📚全部专栏
「VS」Visual Studio「C/C++」C/C++程序设计「UG/NX」BlockUI集合
「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发
「QT」QT5程序设计「File」数据文件格式「PK」Parasolid函数说明

目录

    • C++ fstream详解
      • 一、引言
      • 二、头文件
      • 三、基本类介绍
      • 四、打开文件
      • 五、关闭文件
      • 六、文件读写操作
        • 1.1 按行读取
        • 1.2 按字符读取
        • 1.3 按块(或缓冲区)读取
        • 1.4 根据特定格式读取
      • 七、流状态验证
      • 八、获取和设置流指针
      • 九、总结

C++ fstream详解

一、引言

C++ 中的文件操作是通过 fstream 文件流来实现的。fstream 是 C++ 标准库中的一个重要部分,它提供了一套完整的类和方法来简化文件的读写操作。这些类包括 ifstream(用于读文件)、ofstream(用于写文件)和 fstream(用于同时读写文件)。

二、头文件

要使用 fstream 相关的功能,首先需要包含 <fstream> 头文件。例如:

#include <fstream>

三、基本类介绍

  1. ifstream

    • 用于从文件读取数据。
    • 继承自 istream,支持使用 >> 操作符进行读取。
  2. ofstream

    • 用于向文件写入数据。
    • 继承自 ostream,支持使用 << 操作符进行写入。
  3. fstream

    • 同时支持读写操作。
    • 继承自 iostream,支持 >><< 操作符。

四、打开文件

文件操作的第一步是打开文件。fstream 类提供了 open 成员函数用于打开文件。

void open(const char* filename, ios_base::openmode mode = ios_base::in | ios_base::out);
  • filename:要打开的文件名。
  • mode:打开文件的模式,可以是以下选项的组合:
    • ios::in:以输入模式打开文件。
    • ios::out:以输出模式打开文件。
    • ios::ate:打开文件后定位到文件末尾。
    • ios::app:所有输出附加在文件末尾。
    • ios::trunc:如果文件已存在,先删除文件内容。
    • ios::binary:以二进制方式打开文件。

例如:

ofstream outfile;
outfile.open("Hello.txt", ios::out | ios::binary);

五、关闭文件

文件操作完成后,需要关闭文件以释放资源。fstream 类提供了 close 成员函数用于关闭文件。

void close();

例如:

outfile.close();

六、文件读写操作

  1. 文本文件读写
    • 使用 << 操作符向文件写入数据。
    • 使用 >> 操作符从文件读取数据。

例如:

ofstream outfile("out.txt");
if (outfile.is_open()) {outfile << "This is a test." << endl;outfile.close();
}ifstream infile("out.txt");
if (infile.is_open()) {char buffer[256];while (infile >> buffer) {cout << buffer << endl;}infile.close();
}

当然,C++ 中读取文件的方式多种多样,除了基本的按行读取和按字符读取外,还有按块(或缓冲区)读取以及根据特定格式读取等方法。以下是对这些读取方式的详细说明:

1.1 按行读取

使用 getline 函数可以从文件中按行读取数据。这个函数有两个版本,一个接受 char* 类型的缓冲区和一个最大长度,另一个接受 std::string 对象。

#include <fstream>
#include <string>
#include <iostream>int main() {std::ifstream infile("example.txt");if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}std::string line;while (std::getline(infile, line)) {std::cout << line << std::endl;}infile.close();return 0;
}
1.2 按字符读取

可以使用 istream 类的 get 成员函数按字符读取文件。这个函数有多种重载形式,可以读取单个字符、字符数组或 std::string 对象。

#include <fstream>
#include <iostream>int main() {std::ifstream infile("example.txt");if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}char ch;while (infile.get(ch)) {std::cout << ch;}infile.close();return 0;
}
1.3 按块(或缓冲区)读取

可以使用 istream 类的 read 成员函数按块读取文件。这种方法通常用于二进制文件,但也可以用于文本文件。

#include <fstream>
#include <iostream>
#include <vector>int main() {std::ifstream infile("example.txt", std::ios::binary);if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}const std::streamsize bufferSize = 1024;char buffer[bufferSize];while (infile.read(buffer, bufferSize)) {std::cout.write(buffer, infile.gcount()); // gcount() 返回实际读取的字符数}// 处理可能的剩余数据if (infile.gcount() > 0) {std::cout.write(buffer, infile.gcount());}infile.close();return 0;
}
1.4 根据特定格式读取

对于特定格式的文件(如 CSV、JSON、XML 等),通常需要结合字符串解析和逻辑判断来读取数据。例如,对于 CSV 文件,可以按行读取,然后使用逗号作为分隔符来解析每一行的数据。

#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <iostream>int main() {std::ifstream infile("example.csv");if (!infile.is_open()) {std::cerr << "Failed to open file." << std::endl;return 1;}std::string line;while (std::getline(infile, line)) {std::stringstream ss(line);std::string item;std::vector<std::string> values;while (std::getline(ss, item, ',')) {values.push_back(item);}// 处理 values 向量中的数据for (const auto& val : values) {std::cout << val << " ";}std::cout << std::endl;}infile.close();return 0;
}

在实际应用中,选择哪种读取方式取决于文件的具体格式和读取需求。对于简单的文本文件,按行或按字符读取通常就足够了;对于二进制文件或复杂格式的文件,可能需要使用按块读取或根据特定格式读取的方法。
2. 二进制文件读写

  • 使用 write 函数写入数据。
  • 使用 read 函数读取数据。
ofstream outfile("binary.dat", ios::binary);
if (outfile.is_open()) {char data[] = "Binary data";outfile.write(data, sizeof(data));outfile.close();
}ifstream infile("binary.dat", ios::binary);
if (infile.is_open()) {char buffer[256];infile.read(buffer, sizeof(buffer));cout << "Read from binary file: " << buffer << endl;infile.close();
}

七、流状态验证

fstream 类提供了一些成员函数来验证流的状态:

  • is_open():检查文件是否成功打开。
  • bad():如果在读写过程中发生严重错误,返回 true
  • fail():除了 bad() 的情况外,如果发生格式错误(如类型不匹配),也返回 true
  • eof():如果读文件到达文件末尾,返回 true
  • good():如果以上任何一个函数返回 false,则 good() 返回 true

八、获取和设置流指针

fstream 类提供了 seekgseekp 函数来设置流指针的位置,以及 tellgtellp 函数来获取流指针的当前位置。

// 设置输入流指针位置
istream& seekg(pos_type pos);
istream& seekg(off_type off, ios_base::seekdir dir);// 设置输出流指针位置
ostream& seekp(pos_type pos);
ostream& seekp(off_type off, ios_base::seekdir dir);// 获取输入流指针位置
pos_type tellg();// 获取输出流指针位置
pos_type tellp();

例如:

ifstream infile("example.txt");
if (infile.is_open()) {infile.seekg(10, ios::beg); // 定位到文件第10个字节char buffer[256];infile.read(buffer, 256);cout << buffer << endl;infile.close();
}

九、总结

fstream 是 C++ 中处理文件操作的重要工具。通过 ifstreamofstreamfstream 这三个类,可以方便地实现文件的读写操作。同时,fstream 类还提供了丰富的成员函数来验证流的状态、获取和设置流指针的位置,从而提高了文件操作的灵活性和可靠性。

希望这篇文章能帮助你更好地理解和使用 C++ 中的 fstream 文件流。


在这里插入图片描述


http://www.ppmy.cn/news/1543738.html

相关文章

深度学习:神经元(Neuron):人工神经网络中的基本单元

神经元&#xff08;Neuron&#xff09;&#xff1a;人工神经网络中的基本单元 在人工神经网络中&#xff0c;神经元是构成网络的基本单元&#xff0c;灵感来源于生物大脑中的神经元。它们是处理信息和学习从数据中提取模式的关键构件。在深度学习和机器学习的背景下&#xff0…

git lfs 安装方法

Git LFS(Large File Storage)是一个用于管理大型文件的 Git 扩展。以下是在不同操作系统上安装 Git LFS 的方法: 在 macOS 上安装 Git LFS 使用 Homebrew 安装: Homebrew 是 macOS 上的包管理器,可以方便地安装 Git LFS。 brew install git-lfs 初始化 Git LFS: 安装完成…

Unix 中文件权限设置

在 Unix 和类 Unix 系统中&#xff0c;文件权限是通过八进制数表示的&#xff0c;这些数字代表不同的权限组合。以下是一些常见的八进制数及其对应的权限设置&#xff1a; 1. **0644**&#xff1a; - 所有者&#xff08;owner&#xff09;&#xff1a;读&#xff08;read&a…

基于微信小程序的音乐播放器系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

(五)Spark大数据开发实战:灵活运用PySpark常用DataFrame API

目录 一、PySpark 二、数据介绍 三、PySpark大数据开发实战 1、数据文件上传HDFS 2、导入模块及数据 3、数据统计与分析 ①、计算演员参演电影数 ②、依次罗列电影番位前十的演员 ③、按照番位计算演员参演电影数 ④、求每位演员所有参演电影中的最早、最晚上映时间及…

(9)位运算

1. 位运算的概念 位运算操作的是整数在内存中的二进制位。C 语言提供了以下几种位运算操作符&#xff1a; 按位与&#xff08;&&#xff09; 运算规则&#xff1a;将两个操作数对应的二进制位进行与运算。只有当两个对应位都为 1 时&#xff0c;结果位才为 1&#xff0c…

UE 引入 IOS framework库的坑

一、我明明已经把framework库进行签名的却在 上传到开发者后台时一直报错 90034 签章遗失 或者 未签 这个问题我最近遇到 极其坑爹 我是这个情况 这是我的framework库的目录 关键就在这了 多出了这个文件 就影响了 上传到开发者后台 就报错 90034 将其删除就好 &…

Gradio DataFrame分页功能详解:从入门到实战

Gradio DataFrame分页功能详解&#xff1a;从入门到实战 1. 引言2. 为什么需要分页&#xff1f;3. 环境准备4. 基础知识准备5. 代码实现5.1 创建示例数据5.2 分页状态管理5.3 分页核心逻辑5.4 创建Gradio界面 6. 关键功能解析6.1 页码计算6.2 数据切片 7. 使用示例8. 实用技巧9…