C++文件和流

        到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。

        本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型:

数据类型描述
ofstream该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream该数据类型表示输入文件流,用于从文件读取信息。
fstream该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream> 和 <fstream>。 

一、打开文件

        在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。

        下面是 open() 函数的标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void open(const char *filename, ios::openmode mode);

        在这里,open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。

模式标志描述
ios::app追加模式。所有写入都追加到文件末尾。
ios::ate文件打开后定位到文件末尾。
ios::in打开文件用于读取。
ios::out打开文件用于写入。
ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。

        您可以把以上两种或两种以上的模式结合使用。例如,如果您想要以写入模式打开文件,并希望截断文件,以防文件已存在,那么您可以使用下面的语法:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

类似地,您如果想要打开一个文件用于读写,可以使用下面的语法:

ifstream  afile;
afile.open("file.dat", ios::out | ios::in );

1.2 示例

        `ofstream outfile` 是定义了一个名为 `outfile` 的输出文件流对象,用于将数据写入磁盘上的文件。可以使用 `<<` 运算符向文件写入数据,例如:

#include<iostream>
#include<fstream>
int main(){
    std::ofstream outfile("example.txt"); // 打开文件
    outfile << "Hello, world!" << std::endl; // 向文件写入数据
    outfile.close(); // 关闭文件
}

        在这个例子中,`outfile` 对象被创建并打开了 `example.txt` 文件(文件的路径可以指定,在上述程序中,我们没有指定文件的路径,则该文件会存放在该程序所存放的文件夹位置中),然后使用 `<<` 运算符向文件写入了 `"Hello, world!"` 字符串以及一个换行符,最后关闭了文件。该文件如打开如下图所示。

        需要注意的是,如果文件不存在,则会创建该文件;如果文件已存在,则会将其覆盖。

        `ifstream afile;` 是定义了一个名为 `afile` 的输入文件流对象,用于从磁盘上的文件读取数据。可以使用 `>>` 运算符从文件读取数据,例如:

#include<iostream>
#include<fstream>
#include<string>
int main() {

	std::ifstream afile("example.txt"); // 打开文件
	std::string line;
	while (std::getline(afile, line)) { // 逐行读取文件内容  注意:必须引入<string>头文件才能正确使用getline函数
		std::cout << line << std::endl; // 输出每一行内容
	}
	afile.close(); // 关闭文件

}

        在这个例子中,`afile` 对象被创建并打开了 `example.txt` 文件,然后使用 `getline()` 函数将文件内容逐行读取到字符串变量 `line` 中,并输出到标准输出流中。最后关闭了文件。

上述程序输出结果:

        需要注意的是,如果文件打开成功,则可以继续读取文件内容;如果文件不存在或无法打开,则需要进行错误处理。在读取文件时,可以根据具体需求选择不同的读取方式和处理方法来读取所需的数据。

关闭文件

        当 C++ 程序终止时,它会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件。但程序员应该养成一个好习惯,在程序终止前关闭所有打开的文件。

        下面是 close() 函数的标准语法,close() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void close();

写入文件

        在 C++ 编程中,我们使用流插入运算符( << )向文件写入信息,就像使用该运算符输出信息到屏幕上一样。唯一不同的是,在这里您使用的是 ofstream 或 fstream 对象,而不是 cout 对象。

读取文件

        在 C++ 编程中,我们使用流提取运算符( >> )从文件读取信息,就像使用该运算符从键盘输入信息一样。唯一不同的是,在这里您使用的是 ifstream 或 fstream 对象,而不是 cin 对象。

文件位置指针

        在 C++ 中,文件位置指针(File Position Pointer)用于标识当前读写位置在文件中的位置。C++ 标准库提供了两个主要的文件位置指针类型:std::ifstreamstd::ofstream,分别用于输入流和输出流。

        ifstream 和 ofstream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数包括关于 ifstream 的 seekg("seek get")和关于 ofstream 的 seekp("seek put")。

        seekg 和 seekp 的参数通常是一个长整型。第二个参数可以用于指定查找方向。查找方向可以是 ios::beg(默认的,从流的开头开始定位),也可以是 ios::cur(从流的当前位置开始定位),也可以是 ios::end(从流的末尾开始定位)。

        文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。下面是关于定位 "get" 文件位置指针的实例:

// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg( n );
 
// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );
 
// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );
 
// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );

文件位置指针主要有以下三种操作:

<1> 定位到文件开头(seekg(0) / seekp(0)): 

std::ifstream inputFile("example.txt");
inputFile.seekg(0);  // 将输入文件位置指针定位到文件开头

std::ofstream outputFile("example.txt");
outputFile.seekp(0);  // 将输出文件位置指针定位到文件开头

seekg(0)seekp(0) 将文件位置指针移动到文件的开头。 

<2> 移动相对位置(seekg(offset, direction) / seekp(offset, direction)):

std::ifstream inputFile("example.txt");
inputFile.seekg(10, std::ios::cur);  // 相对于当前位置向前移动 10 个字节

std::ofstream outputFile("example.txt");
outputFile.seekp(-5, std::ios::end);  // 相对于文件末尾向后移动 5 个字节

seekg(offset, direction)seekp(offset, direction) 可以在文件中移动位置指针。offset 表示要移动的偏移量,可以是正数或负数。direction 指定了移动的方向,可以使用以下值: 

  • std::ios::beg:相对于文件开头进行偏移,默认值。
  • std::ios::cur:相对于当前位置进行偏移。
  • std::ios::end:相对于文件末尾进行偏移。

<3> 定位到文件末尾(seekg(0, std::ios::end) / seekp(0, std::ios::end)):

std::ifstream inputFile("example.txt");
inputFile.seekg(0, std::ios::end);  // 将输入文件位置指针定位到文件末尾

std::ofstream outputFile("example.txt");
outputFile.seekp(0, std::ios::end);  // 将输出文件位置指针定位到文件末尾

  seekg(0, std::ios::end)seekp(0, std::ios::end) 将文件位置指针移动到文件的末尾。

        注意:文件位置指针操作需要在打开文件后才能使用。另外,对于二进制文件,应该使用 std::ios::binary 模式打开文件来确保精确的指针操作。

示例

#include<iostream>
#include<fstream>

int main() {
    std::ofstream outfile("D:/桌面资料/研究生阶段/C++Learning_road/C++file_test/example.txt"); // 打开文件
    outfile << "Hello, world!"; // 向文件写入数据
    outfile.seekp(0); // 将文件位置指针移动到文件的开头
    outfile.seekp(5, std::ios::cur);  // 相对于当前位置向前移动 5 个字节 
    outfile << "世界,你好!" << std::endl; // 向文件写入数据
    outfile.close(); // 关闭文件
    return 0;
}

运行上述程序,得到如下结果: 

 程序分析:

  这段代码首先创建了一个名为 "D:/桌面资料/研究生阶段/C++Learning_road/C++file_test/example.txt" 的文件输出流对象 `outfile`,然后向文件中写入了字符串 "Hello, world!"。接下来,代码将文件位置指针移动到文件开头,然后相对于当前位置向前(向前的原理如下图所示)移动 5 个字节。最后,代码向文件中写入了字符串 "世界,你好!" 并添加了一个换行符。

        需要注意的是,`seekp(0)` 将文件位置指针移动到文件开头,然后 `seekp(5, std::ios::cur)` 将文件位置指针相对于当前位置向前移动 5 个字节,因此,最终的文件位置指针指向了字符 'w'。

通过执行这段代码,你将会在指定路径的 example.txt 文件中得到以下内容:

Hello世界,你好!

        最后,通过调用 `outfile.close()` 关闭文件。关闭文件是一个好的习惯,可以确保文件资源被正确释放,同时也可以确保文件的写入操作已经完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/103902.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb——IDEA相关配置(Maven配置以及创建自己的第一个Maven项目)

写在前面&#xff1a; 笔者根据狂神说的javaweb视频&#xff0c;一步一步跟着配置IDEA中的Maven&#xff0c;在后面&#xff0c;笔者将讲述自己如何从0配置Maven以及创建自己的第一个Maven项目&#xff0c;笔者将自己的心路历程&#xff0c;包括配置的过程&#xff0c;都以文字…

【TGRS 2023】RingMo: A Remote Sensing Foundation ModelWith Masked Image Modeling

RingMo: A Remote Sensing Foundation Model With Masked Image Modeling, TGRS 2023 论文&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9844015 代码&#xff1a;https://github.com/comeony/RingMo MindSpore/RingMo-Framework (gitee.com) …

汽车4S店如何在数字化管理下,提高市场竞争力

在所有人都认为疫情过后&#xff0c;经济形势会一路向阳&#xff0c;但是&#xff0c;实际情况出乎所有人的意料&#xff0c;各行各业举步维艰。 新闻爆出的各大房地产&#xff0c;恒大的2.4万亿让人瞠目结舌&#xff0c;还有碧桂园和融创&#xff0c;也是债台高筑了&#xff…

嵌入式 Tomcat 调校

SpringBoot 嵌入了 Web 容器如 Tomcat/Jetty/Undertow&#xff0c;——这是怎么做到的&#xff1f;我们以 Tomcat 为例子&#xff0c;尝试调用嵌入式 Tomcat。 调用嵌入式 Tomcat&#xff0c;如果按照默认去启动&#xff0c;一个 main 函数就可以了。 简单的例子 下面是启动…

Power BI 傻瓜入门 9. 设计和部署数据模型

本章内容包含&#xff1a; 详细说明设计数据模型的技术要求Power BI Desktop中基本数据模型的设计将数据模型从Power BI Desktop发布到Power BI Services 在数据进入Power BI后对其进行操作既是一门艺术&#xff0c;也是一门科学。导入到任何应用程序中的数据不仅需要注意数据…

从力扣[203]理解递归思想

本文旨在通过使用递归方法的使用来进一步了解递归思想 class Solution {public ListNode removeElements(ListNode head, int val) {if (head null) {return head;}head.next removeElements(head.next, val);return head.val val ? head.next : head;} }既然要使用递归算法…

【golang】Go中的切片slice和操作笔记,垃圾回收机制,重组 reslice ,复制和追加,内存结构

切片 文章目录 切片将切片传递给函数make() 创建一个切片new() 和 make()的区别多维切片bytes包for-range切片重组 reslice切片的复制和追加 字符串、数组和切片的应用获取字符串的某一部分字符串和切片的内存结构修改字符串中的某个字符字节数组对比函数搜索及排序切片和数组a…

一、PHP环境搭建[phpstorm]

一、安装 1.php编写工具 地址&#xff1a;https://www.jetbrains.com/phpstorm/download/#sectionwindows 图示&#xff1a; 2.php环境 解释&#xff1a;建议使用phpstudy进行安装&#xff0c;安装较为简单 链接&#xff1a;https://www.xp.cn/ 图示&#xff1a; 二、第…

微信小程序投票管理系统:打造智能、便捷的投票体验

前言 随着社交网络的兴起和移动互联网的普及&#xff0c;人们对于参与和表达意见的需求越来越强烈。在这个背景下&#xff0c;微信小程序投票管理系统应运而生。它为用户提供了一个智能、便捷的投票平台&#xff0c;使用户可以轻松创建和参与各种类型的投票活动。本文将详细介…

【德哥说库系列】-PostgreSQL跨版本升级

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

STM32-LCD中英文显示及应用

目录 字符编码 ASCII码&#xff08;8位&#xff09; 中文编码&#xff08;16位&#xff09; GB2312标准 GBK编码 GB18030标准&#xff08;32位&#xff09; Big5编码 Unicode字符集和编码 UTF-32&#xff08;32位&#xff09; UTF-16&#xff08;16位/32位&#xff0…

[AutoSar NVM] 存储架构

依AutoSAR及公开知识辛苦整理&#xff0c;禁止转载。 专栏 《深入浅出AutoSAR》&#xff0c; 全文 2900 字. 图片来源&#xff1a; 知乎 汽车的ECU内存中有很多不同类型的变量&#xff0c;这些变量包括了车辆各个系统和功能所需的数据。大部分变量在ECU掉电后就会丢失&#x…

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能&#xff08;AI&#xff09;中&#xff0c;"Prompt"通常指的是向AI系统提供的输入或指令&#xff0c;用于引导AI进行特定的操作或生成特定的输出。例如&#xff0c;在一个对话型AI系统中&#xff0c;用户输入的问题就是一个prompt&…

高校教务系统登录页面JS分析——西安科技大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

《数字图像处理》作业一:题目+学习笔记

Hi,学习进步,共同加油💪 1、选择题 (每小题3分,总计24分) (1)下列哪种图像属于数字图像( ) A、电影胶片;B、普通照片;C、手机拍照;D、眼前看到的景物 数字图像是由离散的像素点组成的图像,可以通过数值表示。根据选项,可以排除A(电影胶片)和B(普通…

Unity中Shader的ShaderLOD

文章目录 前言一、ShaderLOD的使用步骤1、ShaderLOD使用在不同的SubShader中&#xff0c;用于区分SubShader所对应的配置2、在 C# 中使用 Shader.globalMaximumLOD 赋值来选择不同的 SubShader,以达到修改配置对应Shader的效果3、在设置LOD时&#xff0c;是需要和程序讨论统一 …

Git简明教程

1.Git的定位 在我们自己开发项目的过程中&#xff0c;经常会遇到这样的情况&#xff0c;为了防止代码丢失&#xff0c;或者新变更的代码影响到原有的代码功能&#xff0c;为了在失误后能恢复到原来的版本&#xff0c;不得不复制出一个副本,比如&#xff1a;“坦克大战1.0”“坦…

创建 Edge 浏览器扩展教程(下)

创建 Edge 浏览器扩展教程&#xff08;下&#xff09; 创建扩展教程&#xff0c;第 2 部分1&#xff1a;更新弹出窗口.html以包含按钮2&#xff1a;更新弹出窗口.html在浏览器选项卡顶部显示图像3&#xff1a;创建弹出式 JavaScript 以发送消息4&#xff1a;从任何浏览器选项卡…

react createElement 和 cloneElement 有什么区别?

前言 什么是react React是一个用于构建用户界面的JavaScript库。它旨在帮助开发人员构建可维护、高性能的应用程序界面。React的核心思想是组件化&#xff0c;它允许开发人员将用户界面划分为小块组件&#xff0c;每个组件负责自己的渲染和行为。这种组件化的方法使得代码更容易…
最新文章