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

news2024/10/28 4:23:48

在这里插入图片描述

✨博客主页
何曾参静谧的博客
📌文章专栏
「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.coloradmin.cn/o/2225171.html

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

相关文章

shodan2---清风

注&#xff1a;本文章源于泷羽SEC&#xff0c;如有侵权请联系我&#xff0c;违规必删 学习请认准泷羽SEC学习视频:https://space.bilibili.com/350329294 实验一&#xff1a;search 存在CVE-2019-0708的网络设备 CVE - 2019 - 0708**漏洞&#xff1a;** 该漏洞存在于远程桌面…

MedSAM微调版,自动生成 Prompt 嵌入实现图像分割!

最近提出的Segment Anything Model (SAM)等基础模型在图像分割任务上取得了显著的成果。 然而&#xff0c;这些模型通常需要通过人工设计的 Prompt &#xff08;如边界框&#xff09;进行用户交互&#xff0c;这限制了它们的部署到下游任务。 将这些模型适应到具有完全 Token 数…

Arduino Uno 同时控制多路舵机

Arduino Uno同时控制4个舵机 舵机可以在0~180度内指定角度的控制。常用于航模、机器人、遥控玩具等物品,然而,很多时候要一次性控制多个舵机,今天以控制4个舵机为例进行说明 接线方式如下图: 舵机的信号线分别接A0,A1,A2,A3。控制舵机从0旋转到180度,再由180度旋转到0度,…

从0开始深度学习(18)——层和块

1 层和块 1.1层 层是神经网络的基本组成单位。每一层由多个神经元&#xff08;或单元&#xff09;组成&#xff0c;这些神经元在前一层的输出上执行某种计算&#xff0c;并将结果传递给下一层。根据功能&#xff0c;层可以分为以下几种类型&#xff1a; 输入层&#xff08;I…

《决策思维:人人必备的决策口袋书》

本书干货很多&#xff0c;十分值得一读。但受众不是一线员工与一线管理者&#xff0c;更多的倾向于管理者的管理者。一线员工读完的最大收获是可以理解老板的决策逻辑与思维方式&#xff0c;便于更好的去做执行。同时&#xff0c;还能帮助判断老板的决策是否正确&#xff0c;是…

【Android】view的基础知识

文章目录 View与ViewGroupView位置参数View的滑动1. scrollTo与scrollBy2. 属性动画ObjectAnimatorViewPropertyAnimator 3. LayoutParams&#xff08;布局参数&#xff09;layout方法offsetLeftAndRight View的弹性滑动1. Scroller 类2. 动画&#xff08;ObjectAnimator&#…

SYN590RL 300MHz至450MHz ASK接收机芯片IC

一般描述 SYN590RL是赛诺克全新开发设计的一款宽电压范围,低功耗,高性能,无需外置AGC电容&#xff0c;灵敏度达到典型-110dBm&#xff0c;300MHz”450MHz 频率范围应用的单芯片ASK或OOK射频接收器。 SYN59ORL是一款典型的即插即用型单片高集成度无线接收器&…

Spring Boot实现的动态化酒店住宿管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…

pytorch的标签平滑介绍

什么是标签平滑(Label Smoothing)? 标签平滑(Label Smoothing)是一种正则化技术,旨在防止模型过度自信(即输出的概率分布过于“尖锐”)。在分类任务中,标准的目标标签是one-hot编码,也就是正确类别的概率为 1,其他类别的概率为 0。而标签平滑通过将正确类别的概率从…

绝了,这款播放器让发烧友疯狂种草,堪称音乐神器

作为音乐爱好者的不二之选&#xff0c;foobar2000凭借其卓越的音频处理能力&#xff0c;在Windows系统用户中树立了极高的声誉。这款轻量级播放器的设计理念是将极致的性能与个性化完美结合。用户可以根据自己的使用习惯&#xff0c;打造出独具特色的播放界面和操作流程。在音频…

【redis】初识非关系型数据库——redis

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 初识 Redis Redis是⼀种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由string&#xff08;字符串&#xff09;、hash&#xff0…

html 登入界面,用户注册界面相关的标签及案例

案例效果图 以上界面的完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Python浪漫之画星星

效果图&#xff08;动态的哦&#xff01;&#xff09;&#xff1a; 完整代码&#xff08;上教程&#xff09;&#xff1a; import turtle import random import time # 导入time模块# 创建一个画布 screen turtle.Screen() screen.bgcolor("red")# 创建一个海龟&a…

【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议&#xff08;IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …

Android 自定义 Dialog 实现列表 单选,多选,搜索

前言 在Android开发中&#xff0c;通过对话框让用户选择&#xff0c;筛选信息是很方便也很常见的操作。本文详细介绍了如何使用自定义 Dialog、RecyclerView 以及自定义搜索框 来实现选中状态和用户交互&#xff0c;文中大本分代码都有明确注释&#xff0c;主打一个简单明了&a…

springboot 同时上传文件和JSON对象

控制器代码 PostMapping("/upload") public ResponseEntity<String> handleFileUpload(RequestPart("file") MultipartFile file,RequestPart("user") User user) {// 处理文件和用户信息return ResponseEntity.ok("File and user i…

tomcat部署war包部署运行,IDEA一键运行启动tomacat服务,maven打包为war包并部署到tomecat

tomcat部署war包前端访问 在Java Web开发中&#xff0c;Tomcat是一个非常流行的开源Web服务器和Servlet容器。它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;提供了一个纯Java的Web应用环境。本文将介绍如何在Tomcat中部署运行WAR包&#xff0c;让你的应用快…

SpringBoot实现mysql多数据源配置(Springboot+Mybatis)

最近在学习SpringBoot的一些知识&#xff0c;主要是参考了纯洁的微笑的一些博客作为练手&#xff0c;想着他已经把入门的教程写的很详细了,如果再简单的把他的教程拷贝到自己的简书&#xff0c;这是是赤裸裸的剽窃&#xff0c;很不地道&#xff0c;作为一个技术人员&#xff0c…

通过页面添加国际化数据,实现vue的国际化

element ui 写在前面1. 原有的vue的国际化处理1.1 语言文件1.2 lang的index.js1.3 入口文件导入1.3 应用 2. 通过页面添加国际化数据2.1 做法2.2 lang的index.js文件修改2.3 需要注意的点 总结写在最后 写在前面 需求&#xff1a;在系统的国际化管理页面添加国际化数据&#x…

机器视觉-相机、镜头、光源(总结)

目录 1、机器视觉光源概述 2、光源的作用 3、光谱 4、工业场景常见光源 4.1、白炽灯 4.2、卤素灯 4.3、 荧光灯 4.4、LED灯 4.5、激光灯 5、光源的基本性能 5.1、光通量 5.2、光效率 5.3、发光强度 5.4、光照度 5.5、均匀性 5.6、色温 5.7、显色性 6、基本光学…