C++复习之文件操作

C++(3): std::ifstream的使用 为了便于对文件的操作,C++标准库中提供了文件输入输出流fstream,并提供了头文件。 fstream又细分了两个分支,分别是处理输入文件流的ifstream和处理输出文件流的ofstream。 ifstream负责将文件从硬盘读取至内存中。 ofstream负责将文件从内存写入硬盘中。 这两者所处理的文件流均包含二进制文件(binary)和文本文件(text)。 接下来我们将针对输入文件流ifstream用实际的例程介绍其使用方法。 阅读详情

在 C++ 中,文件操作主要依赖于 fstream 库,该库提供了文件输入输出的基础功能。文件操作可以分为读取文件和写入文件两部分,分别对应 ifstream(文件输入流)和 ofstream(文件输出流)。

fstream 类同时支持文件的读写操作。

接下来,我将详细介绍 C++ 中文件操作的相关知识,包括文件的打开、读取、写入、关闭等操作。

在这里插入图片描述


1. 包含头文件 <fstream>

在进行文件操作前,需要包含 <fstream> 头文件,该头文件提供了文件流类的定义:

#include <fstream>
#include <iostream>

2. 文件流类

<fstream> 头文件定义了三个主要的类:

  • ifstream(输入文件流):用于读取文件数据。
  • ofstream(输出文件流):用于向文件写入数据。
  • fstream(文件流):支持同时进行文件的读取和写入操作。

3. 打开文件

在文件操作之前,首先需要打开文件。可以使用构造函数或 open 方法打开文件。打开文件时可以指定文件的打开模式(例如读、写、追加等)。

打开模式

模式说明
ios::in读模式(默认值,仅限于 ifstream)
ios::out写模式(默认值,仅限于 ofstream)
ios::app追加模式,数据写入到文件末尾
ios::ate打开文件后,文件指针定位到文件末尾
ios::trunc截断模式,如果文件存在,清空文件内容
ios::binary二进制模式,以二进制方式读写
std::ifstream fin("file.txt", std::ios::in);  // 以只读模式打开
std::ofstream fout("file.txt", std::ios::out); // 以只写模式打开
std::fstream fio("file.txt", std::ios::in | std::ios::out); // 读写模式打开

💡 补充建议

为了更好地掌握文件的打开和模式,建议多尝试各种组合模式,比如同时使用 ios::in | ios::out | ios::app,观察文件的内容变化情况。


4. 检查文件是否打开成功

在打开文件后,可以通过 is_open 方法检查文件是否成功打开。若文件打开失败,应输出提示信息并进行相应处理。

std::ifstream fin("file.txt");
if (!fin.is_open()) {
    std::cerr << "无法打开文件!" << std::endl;
    return 1; // 返回错误码
}

💡 错误处理建议

建议在打开文件失败时提供更详细的错误信息,例如是否文件路径正确,是否权限足够,以帮助定位问题。


5. 写入文件

使用 ofstream 或 fstream 可以向文件中写入数据。写入文件类似于使用 cout 输出数据,只是目标从控制台变成了文件流对象。

#include <fstream>
#include <iostream>

int main() {
    std::ofstream fout("output.txt", std::ios::out);
    if (!fout) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    fout << "Hello, World!" << std::endl;
    fout << "写入文件操作示例" << std::endl;

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

💡 提示

可以尝试使用 ofstream 的追加模式(ios::app),观察文件内容变化,理解文件指针位置的影响。


6. 读取文件

使用 ifstream 或 fstream 可以从文件中读取数据。读取文件类似于使用 cin 从控制台输入数据,只是源数据变成了文件。

逐行读取

使用 getline 可以逐行读取文件内容:

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

int main() {
    std::ifstream fin("input.txt", std::ios::in);
    if (!fin) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    std::string line;
    while (getline(fin, line)) { // 持续读取直到文件结束
        std::cout << line << std::endl; // 输出到控制台
    }

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

💡 提示

getline() 是逐行读取的非常有用的函数,适用于读取文本文件的内容。可以尝试读取包含不同数据格式的文件,理解如何解析内容。

按单词读取

可以使用 >> 运算符按单词读取文件内容:

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

int main() {
    std::ifstream fin("input.txt", std::ios::in);
    if (!fin) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    std::string word;
    while (fin >> word) { // 每次读取一个单词
        std::cout << word << std::endl;
    }

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

💡 提示

对于带有标点符号的文本,>> 运算符会将标点符号和单词分开。可以尝试使用正则表达式来更灵活地处理单词分割。


7. 文件的随机访问

在文本或二进制文件中,可以通过 seekg 和 seekp 函数实现随机访问,分别用于输入和输出流。

  • seekg:用于设置读取位置
  • seekp:用于设置写入位置

位置参数:

参数说明
ios::beg文件开头
ios::cur当前位置
ios::end文件末尾
#include <fstream>
#include <iostream>

int main() {
    std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::trunc);
    file << "Hello, World!";
    file.seekp(0, std::ios::beg); // 设置写指针到文件开头
    file << "Hi"; // 覆盖开头的内容
    file.seekg(0); // 设置读指针到文件开头

    std::string content;
    file >> content; // 读取文件
    std::cout << content << std::endl;

    file.close();
    return 0;
}

💡 提示

随机访问文件在处理大型数据文件时非常有用,可以显著提高读取和写入的效率。


8. 二进制文件读写

文本文件中数据以文本格式存储,二进制文件中数据以原始二进制形式存储,文件体积更小,适合保存结构化数据(例如图像、音频等)。

使用 ios::binary 模式打开文件,然后使用 read 和 write 进行二进制读写:

#include <fstream>
#include <iostream>

struct Data {
    int id;
    double value;
};

int main() {
    Data data = {1, 3.14};
    std::ofstream fout("data.bin", std::ios::binary);
    if (!fout) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    fout.write(reinterpret_cast<char*>(&data), sizeof(data));
    fout.close();

    return 0;
}
#include <fstream>
#include <iostream>

struct Data {
    int id;
    double value;
};

int main() {
    Data data;
    std::ifstream fin("data.bin", std::ios::binary);
    if (!fin) {
        std::cerr << "文件无法打开!" << std::endl;
        return 1;
    }

    fin.read(reinterpret_cast<char*>(&data), sizeof(data));
    fin.close();

    std::cout << "ID: " << data.id << ", Value: " << data.value << std::endl;

    return 0;
}

💡 提示

在使用二进制模式时,确保数据结构的对齐方式一致,以避免跨平台数据读取时可能出现的问题。


9. 关闭文件

文件操作完成后,最好使用 close 关闭文件,以释放资源。尽管文件在析构时会自动关闭,但显式关闭文件是个好习惯。

fin.close();
fout.close();

10. 文件异常处理

可以使用 try-catch 捕获文件操作中的异常,并通过检查 fail()、eof() 和 bad() 来处理文件的状态。

std::ifstream file("test.txt");
if (!file) {
    std::cerr << "文件无法打开!" << std::endl;
    return 1;
}

if (file.fail()) {
    std::cerr << "文件操作失败!" << std::endl;
}

if (file.eof()) {
    std::cout << "已达到文件末尾" << std::endl;
}

💡 提示

bad() 和 fail() 都是检查文件状态的有用函数。bad() 检查是否发生了不可恢复的错误,而 fail() 还可以用于检测可恢复的错误。


11. 常用文件操作函数

函数名说明
open()打开文件
is_open()检查文件是否打开
close()关闭文件
write()写入二进制数据
read()读取二进制数据
put()写入单个字符
get()读取单个字符
getline()读取一行文本
seekg()设置输入指针位置
seekp()设置输出指针位置
tellg()获取当前输入指针位置
tellp()获取当前输出指针位置
eof()检查是否到达文件末尾
fail()检查文件操作是否失败
bad()检查是否发生不可恢复的错误
good()检查文件流是否正常
clear()清除文件
CSP考试复习:第一单元 C++语言基础1.7 字符串操作1.8 文件操作 1.7 字符串操作! 头文件:<cstring>。printf 和 scanf 在<cstdio>中,cin 和 cout 在头文件<iostream>中且位于 std 命名空间内。 下面假设待处理的字符串为 str 和 str2,即:char str[MAX], str2[MAX]; 牢记,字符串的最后一个字符一定是'\0'。如果字符串内没有'\0',进行以下操作(输入除外)时可能 会造成意外事故。 1. 输出字符串 str:  cout<<str;  阅读详情

相关推荐

C++读取二进制文件

其中,ifstream是用于读取文件的流对象,可以通过其构造函数来打开一个文件,然后像读取普通文本文件一样从中读取数据。然后,它动态分配了一个与文件大小相等的字符数组,并一次性读取整个文件到该数组中。以读取二进制文件中的int数组为例,我们可以先打开文件,然后读取文件大小,根据大小动态分配内存,最后一次性读取整个文件到内存中,并按照需要进行转换。如果要在不同的机器上移植该代码,可能需要进行额外的转换或重新编译。接下来,我们将这个字符数组转换为int类型的数组,并遍历输出每个元素的值。C++读取二进制文件。

TechRoarX的博客 856

C++文件操作之读写二进制文件

C++

m0_67168421的博客 1万+

用C/C++实现的背单词系统:完整教程与源码

/ 定义一个简单类private:public:// 定义模板函数// 使用模板函数return 0;在这个代码块中,我们定义了一个Rectangle类和一个add模板函数。Rectangle类有两个私有数据成员width和height,并且有一个公共成员函数area来计算矩形的面积。add函数是一个模板函数,可以接受任何类型作为参数并返回它们的和。在main函数中,我们创建了一个Rectangle对象并打印其面积,然后调用add。

weixin_36299472的博客 935

C++ 读写二进制文件

C++来读取二进制文件二进制文件的格式可以多种多样,比如dat、index等,还可以是自行定义的格式。

weixin_42156097的博客 6097

Cadence OrCAD常见引脚错误排查指南:从原理图到封装的完整解决方案

本文详细解析Cadence OrCAD设计中常见的引脚错误问题,提供从原理图到封装的系统化解决方案。涵盖错误诊断、元件库修复、封装管理及自动化处理技巧,帮助工程师高效解决ORCAP-36022等典型错误,确保设计流程顺畅。

weixin_29294975的博客 255

从零开始解析N-CMAPSS数据集:航空发动机健康管理的入门指南

本文详细解析了N-CMAPSS数据集在航空发动机健康管理中的应用,从数据集的构成、关键变量到实际数据分析方法,为初学者提供了全面的入门指南。通过Python代码示例,展示了如何加载、探索和建模这一复杂数据集,帮助读者掌握航空发动机性能预测的核心技术。

weixin_29063979的博客 318

C、C++读取数据文件DAT(二进制文件)

通过网上大佬的笔记总结本篇文章,并编译运行,后续会总结出多种读取二进制文件。(1)头文件(2)FILEFILE 是 头文件中的一个结构体,它专门用来保存文件信息。(3)fopen// filename -- 为文件名(包括文件路径). // mode -- 为打开方式,它们都是字符串。// 返回值 -- fopen() 会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的结构体变量中,然后将该变量的地址返回。;

weixin_55491446的博客 2万+

运行stable-diffusion出现的问题

解决:即用 https://github.com/CompVis/taming-transformers/blob/master/taming/modules/vqvae/quantize.py 新文件,替换错误提示文件中的全部内容即可。5.新建文件夹 CompVis/stable-diffusion-safety-checker/将下载的四个文件放入 解决!后面还会遇到'openai/clip-vit-large-patch14离线下载的问题,同样步骤解决。解决:下载后离线,步骤如下。

weixin_52121118的博客 2345

c++复习之文件操作

文件操作知识点基本概念和文件流类文件流类打开和关闭文件打开文件打开方式关闭文件文件打开模式标记文件读写操作读写文本文件成员函数put()和get()读写文件getput二进制文件专用函数文本与二进制文件优缺点文本二进制随机访问文件istream中与位置指针相关函数ostream中与位置指针相关的函数 对c++来说,很重要的一个内容。 知识点 基本概念和文件流类 根据数据编码的不同,可分为文本文件和二进制文件。 文本文件:文件中的每个字节都是一个ascii码 二进制文件:非文本文件统称二进制文件 读文件:文本

guangod的博客 342

别再手动配电脑了!手把手教你用Windows Server 2022搭建企业AD域(附DNS配置避坑指南)

本文详细介绍了如何使用Windows Server 2022搭建企业AD域,提升20+终端的管理效率。通过实战案例和避坑指南,解析AD域的核心价值、部署步骤及DNS配置技巧,帮助企业实现集中权限管理、安全策略统一部署,显著降低IT运维成本。

weixin_30652897的博客 348

百度地图街景图像批量获取

由于个人研究需要在最近试了一下使用API获取百度地图街景图片,在此介绍一下基于我个人需求的百度街景批量获取方法,本文以Python编码作为主要方法,如果对零编码工具有需要的可以关注一下UA城市分析小组刚刚发布的街景图片获取工具。 街景图像用作区域细粒度空间指标测度需要解决几个问题。 1. 首先就是调用额度的限制,现在百度对于个人认证开发者每天可用的街景图像调用额度为100张,在不考虑购买额度上限(1万张600元,其实有经费的前提下可以直接考虑钞能力)的情况下动辄几千上万张的爬取数量会大大增加需要爬取的时间周

boycetoon29的博客 1万+

C++ 考前复习 文件操作

1.文件操作 程序运行时产生的数据都是临时数据,一旦程序结束运行就会被释放我们可以通过文件操作将数据持久化保存。 文件的类型分为两种: 1.文本文档 :文件以文本的ASCII码形式存储在计算机中。 2.二进制文件:文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂。 在cpp中对文件操作要包含 #include <fstream>这个头文件,因为C++定义的文件的输入输出流类,在这个头文件里面声明。 文件操作的三大类 ifstream 只读 ofstream 只写 ...

qq_50119037的博客 268

科研——ICONIP论文修改和提交

ICONIP说明文档

Blackoutdragon的博客 6645

c++文件操作(复习)

C语言中,I/O操作可以简单地看作是从程序移进或移出字节,这种搬运的过程便称为流(stream)。程序只需要关心是否正确地输出了字节数据,以及是否正确地输入了要读取字节数据,特定I/O设备的细节对程序员是隐藏的。 c++必包含的头文件 iostream 意味就是输入输出流 首先使用标准库函数进行文件相关操作 程序为同时处于活动状态的每个文件声明一个指针变量,其类型为FILE*。这个指针指向这个FILE结构,当它处于活动状态时由流使用。 流通过fopen函数打开。为了打开一个流,我们必须指定需要访问的文件或

weixin_46048117的博客 325

PX4控制云台的两种方式 方法适用控舵机 控灯

云台控制插件是mount_control,运行mavros启动文件的时候需要注意该插件是否正常启动,需要在px4_pluginlists.yaml配置文件中将mount_control从blacklisted中移除后才可启动。后会默认占用AUX端口1-4,此时通过AUX通道1-4输出PWM控制信号至云台,对应的RC通道映射功能失效。控制信号输入为RC 则接收机必须连接对应的通道至AUX辅助通道,并通过MNT_MAN_*参数设置pitch/roll/yaw对应的AUX通道。配置为AUTO或MAVLINK,

z1872385的博客 3668

我正用AI Agent重构传统GIS 核心功能,说大白话做空间分析

GeoAI-UP项目通过AI Agent技术实现自然语言驱动的空间分析,核心创新包括: 意图识别层:通过LLM理解用户需求,自动拆解为可执行目标 智能任务规划:动态生成分析流程,处理复杂依赖关系 统一算子架构:采用标准化接口封装200+空间分析功能 可视化工作流。

专注GIS软件开发。 495

[c++]chap-2文件操作复习

c++ 文件操作复习

maymemaomao的博客 506

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++复习笔记--C++文件操作

文件打开方式可以利用 | 操作符进行配合使用;文本文件:文件以 ASCII 码的文本形式存储在计算机中;ios::trunc 如果文件存在,则先删除再创建。二进制文件:文件以二进制的文本形式存在在计算机中;ios::app 以追加方式写文件。ios::binary 以二进制方式打开。ofstream: 写操作。ifstream: 读操作。fstream: 读写操作。4--写入二进制文件。5--读入二进制文件。

牵一只蜗牛去散步 249

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【C/C++复习】5 文件操作

r(read):读,w(write):写,a(append):追加,t(text):文本文件,b(binary):二进制文件,+:读和写。文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。会获取文件信息,包括文件名、文件状态、当前读写位置等,并将这些信息保存到一个 FILE 类型的。使用 头文件中的。

Amber_7422的博客 429

C++复习03---文件操作写入和读取

// 写相应的东西到指定的目录中,并查询文件中的信息 void test03() { ofstream writefile; writefile.open("D:\\VS code\\book.txt"); // 这样的绝对路径可以识别 writefile << "C++程序设计" << " " << "xiaoxiao" << ...

刘小雨的博客 294

《C++ Primer Plus》第六章复习题和编程练习

《C Primer Plus》第六章复习题和编程练习

潇雪的博客 959

C/C++复习的一周

我的第二篇博客 这周星期一我辞去了现在的工作,准备在家复习一周再去工作,而在复习的时候确实收获了很多,对于以前很多不太了解的一些知识点也有了全新的认识,很多原来已经被封印到记忆深处的一些知识点也挖出来了,这篇文章是对于我自己现有的知识做的一个回顾加补充,我是学习C/C++ 和C#的 但是下份工作我希望是做C++的,所有也主要复习了这方面的,东西没有具体的写哪些,但是希望各位也能收获点什么! ...

WindClearing的博客 370

c++文件操作

将程序数据进行存储,便于研究1.文本文件:ASCLL码存储2.二进制文件:二进制的形式存储,浅显的加密方式1.ofstream (写2.ifstream (读3.fstream (读写ofs.open("文件名“,打开方式);ofs<<"应写数据”;与写文件类似(修改操作类),只有第四步有区别判断是否成功打开文件ifs.open("文件名“,打开方式);四种方式读取(不好用......二进制可以操作自定义类型(慎用c++中的string类型,易出错)ifs.open("文件名“,打开方式);

s_cjy的博客 873

在pc机中运行的c++ 语言程序,char类型的数据占( )字节.,2015最新电大C++语言程序设计期末复习题(本)资料考试小抄.doc...

2015最新电大C语言程序设计期末复习题(本)资料考试小抄电大C++语言程序设计复习题资料参考一、单选题1. 在定义函数的格式类型修饰符 函数名 (形式参数表)函数体;中,函数体可以是( )。A、基本语句 B、复合语句C、空语句 D、语句序列2.A>B&&A<=B的值( )。A、为true B、为falseC、与A>B 的值相同 D、与A<=B的值相同3.每一个实在参数就是一个(...

weixin_27734811的博客 116

2022华南师范大学C++程序设计(918)硕士研究生考试最后提分tips第一期

前言 承蒙各位厚爱,我并不是什么大佬,可能很多人都不理解我为什么要无私分享这些资料,这不是帮助竞争对手吗,其实并非如此,因为有各位的关注,我将我的思路公之于众,很多我自己没有发现的错误,大家会发现同时好心的会向我指出来,大家每一次的指正这对于我来说都是一次提升,如果没有发博客,可能很多知识点我还是秉持则我错误的想法,可能到时候考完后看到分数都不知道为什么会那么低,可能就怪学校压分了,还有我也算半个程序员吧,之前在某厂实习半年,每天忙于业务开发,需求永远源源不断,而我自己又想对自己感兴趣的方向去做研究,所以就

weixin_43744732的博客 2379

C++文件操作:按行读取复制到另一个文件

由于对C++的文件操作并不是太熟练,因此复习了一下顺便写了一个小例子用来巩固,顺便解决了换行的问题: #include <iostream> #include <string> #include <fstream> using namespace std; int main(int argc, char *argv[]) { string buf0,...

The_perfect_world的博客 1886
上一篇: C++复习之 输入输出流 iostream istream ostream fstream详解
下一篇: C++ 设计模式复习 ----单例模式
秋到亦天凉
博客等级 码龄6年 4238粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋到亦天凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值