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

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「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.mzph.cn/bicheng/58783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

liunx网络套接字 | 实现基于tcp协议的echo服务

前言&#xff1a;本节讲述linux网络下的tcp协议套接字相关内容。博主以实现tcp服务为主线&#xff0c;穿插一些小知识点。以先粗略实现&#xff0c;后精雕细琢为思路讲述实现服务的过程。下面开始我们的学习吧。 ps&#xff1a;本节内容建议了解网络端口号的友友们观看哦。 目录…

uni-app 运行HarmonyOS项目

1. uni-app 运行HarmonyOS项目 文档中心 1.1. HarmonyOS端 1.1.1. 准备工作 &#xff08;1&#xff09;下载DevEco Studio开发工具。   &#xff08;2&#xff09;在 DevEco Studio 中打开任意一个项目&#xff08;也可以新建一个空项目&#xff09;。   &#xff08;3&…

WPF+MVVM案例实战(十三)- 封装一个自定义消息弹窗控件(上)

文章目录 1、案例效果2、功能实现1、创建文件2、资源文件获取3、枚举实现3、弹窗实现1、界面样式实现2、功能代码实现4、总结1、案例效果 2、功能实现 1、创建文件 打开 Wpf_Examples 项目,我们在用户控件类库中创建一个窗体文件 SMessageBox.xaml,同时创建枚举文件夹 Enum…

Unity BesHttp插件修改Error log的格式

实现代码 找到插件的 UnityOutput.cs 然后按照需求替换为下面的代码即可。如果提示 void ILogOutput.Flush() { } 接口不存在&#xff0c;删除这行代码即可。 using Best.HTTP.JSON.LitJson; using System; using System.Collections.Generic; using UnityEngine; using Syst…

Python热化学固态化学模型模拟

&#x1f3af;要点 使用热化学方式&#xff0c;从材料项目数据库获得热力学数据构建固态材料无机合成模拟模型。固态反应网络是热力学相空间的模型&#xff0c;使得能够纳入简单的反应动力学行为。反应坐标图可视为加权有向图&#xff0c;其表示出热力学相空间的密集连接模型。…

详解软件设计中分库分表的几种实现以及应用示例

详解软件设计中分库分表的几种实现以及应用示例https://mp.weixin.qq.com/s?__bizMzkzMTY0Mjc0Ng&mid2247485108&idx1&sn8b3b803c120c163092c70fa65fe5541e&chksmc266aaa1f51123b7af4d7a3113fe7c25daa938a04ced949fb71a8b7773e861fb93d907435386#rd

简缩极化模型+简缩极化求解用优化的方法,也需要保证方程和未知数个数

一个定标器可以得到一个复数矢量&#xff0c;4个实数方程 而模型中我们有&#xff0c;每个定标器有不同的A和φ (两个实数)和相同的R和δc &#xff08;4个复数&#xff09;

多浏览器同步测试工具的设计与实现

在做Web兼容测试时&#xff0c;测试人员往往需要在不同浏览器上重复执行相同的操作。 现有自动化录制手段&#xff0c;其实是后置的对比&#xff0c;效率与反馈都存在延迟&#xff0c;执行过程相对是黑盒的&#xff0c;过程中如果测试人员没细化到具体的校验点&#xff0c;即使…

Google Recaptcha V2 简单使用

最新的版本是v3&#xff0c;但是一直习惯用v2&#xff0c;就记录一下v2 的简单用法&#xff0c;以免将来忘记了 首先在这里注册你域名&#xff0c;如果是本机可以直接直接填 localhost 或127.0.0.1 https://www.google.com/recaptcha/about/ 这是列子 网站密钥&#xff1a;是…

【初识Linux】

寻不到花的折翼枯叶蝶&#xff0c;永远也看不见凋谢............................................................................. 文章目录 前言 一、【基本指令】 1、ls 2、pwd 3、cd 4. touch 5.mkdir 6.rmdir 7、rm 8.man 9.cp 10、mv 11、cat 12、tac 13、more 14、le…

操作系统知识要点

一.操作系统的特性 1.并发性 在多道程序环境下&#xff0c;并发性是指在一段时间内&#xff0c;宏观上有多个程序同时运行&#xff0c;但实际上在单CPU的运行环境&#xff0c;每一个时刻只有一个程序在执行。 因此&#xff0c;从微观上来说&#xff0c;各个程序是交替、轮流…

jenkins搭建及流水线配置

1.安装docker curl https://mirrors.aliyun.com/repo/Centos-7.repo >> CentOS-Base-Aliyun.repomv CentOS-Base-Aliyun.repo /etc/yum.repos.d/yum -y install yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/…

混沌接口压测利器Fortio:从TCP/UDP到gRPC,全方位覆盖云原生应用性能测试

#作者&#xff1a; 西门吹雪 文章目录 Fortio 安装docker 安装:MacOS安装&#xff1a;linux安装:对于http负载生成最重要的标志:Fortio server 功能 TCPUDPgRPC负载测试gRPC 负载测试在k8s或者容器中使用fortio进行压测fortio 直接在docker中作为sidecar使用 Fortio是一个微服…

【笔记】数据结构与算法

参考链接&#xff1a;数据结构(全) 参考链接&#xff1a;数据结构与算法学习笔记 一些PPT的整理&#xff0c;思路很不错&#xff0c;主要是理解角度吧&#xff0c;自己干啃书的时候结合一下会比较不错 0.总论 1.数据 注&#xff1a;图是一种数据结构&#xff01;&#xff01;…

leetcode - 684. 冗余连接

684. 冗余连接 解决思路 大致上的思路就是将元素加入到 并查集 中&#xff0c;那么在遍历到边的时候先去判断的边的两个端点的 根节点 是否相等&#xff0c;如果相等&#xff0c;那么就代表此刻把这条边加上去就形成了环【可以这么理解&#xff0c;如果形成了环&#xff0c;那…

【力扣打卡系列】二叉树·灵活运用递归

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day16 相同的树 题目描述 解题思路 边界条件&#xff0c;其中一个节点为空&#xff0c;return 只有p和q均为空才返回true&#xff0c;因此可以简写为pqreturn&#xff0c;先判断节点值是否一样&…

创建一个基于SSM框架的药品商超管理系统

创建一个基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的药品商超管理系统是一个涉及多个步骤的过程。以下是一个详细的开发指南&#xff0c;包括项目结构、数据库设计、配置文件、Mapper接口、Service层、Controller层和前端页面的示例。 1. 需求分析 明…

二十七、Python基础语法(面向对象-上)

面向对象&#xff08;oop&#xff09;&#xff1a;是一种程序设计的方法&#xff0c;面向对象关注的是结果。 一、类和对象 类和对象&#xff1a;是面向对象编程中非常重要的两个概念。 类&#xff1a;具有相同特征或者行为的一类事物&#xff08;指多个&#xff09;的统称&…

UML图之对象图详解

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 零、什么是对象图 对象图&#xff08;Object Diagram&#xff09;是UML中一种重要的静态结构图&#xff0c;它用于表示在特定时间点上系统中的对…

同三维T80004EHH-4K30W 4K超清HDMI编解码器

1路HDMI输入1路3.5音频输入&#xff0c;1路HDMI输出1路3.5音频输出&#xff0c;1个USB1个TF卡槽&#xff0c;带RS485 支持4K30&#xff0c;支持2路解码2路转码&#xff0c;可选配WEBRTC/NDI协议&#xff0c;可选配硬件WEBRTC解码&#xff0c;编码、解码、转码、导播、录制多功…