C++ | 高级教程 | 文件和流

news/2025/2/28 17:10:54/

👻 概念

文件流输出使用标准库 fstream,定义三个新的数据类型:

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

👻 准备工作

  • 使用文件流需要包含 <iostream><fstream> 头文件
#include <fstream>
#include <iostream>

👻 打开文件

👾语法格式

使用 open() 函数打开文件,是 fstreamifstreamofstream 对象的成员

void open(const char *filename, ios::openmode mode);
  • 参数 filename —— 打开文件的名称和位置

  • 参数 mode —— 文件被打开的模式

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

👾示例代码

  • 示例1:以写入模式打开文件,并希望截断文件,以防文件已存在

    ofstream outfile;
    outfile.open("file.dat", ios::out | ios::trunc );
    
  • 示例2:打开一个文件用于读写

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

👻 关闭文件

👾语法格式

使用 close() 函数打开文件,是 fstreamifstreamofstream 对象的成员。

程序终止时,会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件

void close();

👾示例代码

outfile.close();

👻 写入文件

👾语法格式

使用流插入运算符 << 向文件写入信息,使用的是 ofstreamfstream 对象

ofstream << data;

👻 读取文件

👾语法格式

使用流提取运算符 >> 向文件写入信息,使用的是 ifstreamfstream 对象

ifstream >> data;

👻 文件位置指针

👾语法格式

使用 istreamseekg(seek get)和关于 ostream 的 seekp(seek put)重新定位文件位置指针

istream& seekg(streampos pos);
ostream& seekp(streampos pos);
  • 参数 pos —— 直接定位到流中的绝对位置,其中 streampos 是一个表示流位置的类型

    istream& seekg(streamoff off, ios::seekdir dir);
    ostream& seekp(streamoff off, ios::seekdir dir);
    
  • 参数 off —— 偏移量(正数/负数)

  • 参数 dir —— 定位方向

    模式标志描述
    ios::beg从流的开头开始计算偏移量
    ios::cur当前读取位置开始计算偏移量
    ios::end从流的末尾开始计算偏移量

👾示例代码

文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。

// 定位到 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);

👻 综合实例

char data[100];// 写模式打开文件
ofstream outfile;
outfile.open("test.txt");
cout << "Writing to the file" << endl;// 写入数据
cout << "Enter your name: ";
cin.getline(data, 100);
outfile << data << endl;cout << "Enter your age: ";
cin >> data;
cin.ignore();
outfile << data << endl;// 关闭文件
outfile.close();  
char data[100];// 读模式打开文件
ifstream infile;
infile.open("test.txt");
cout << "Reading from the file" << endl;// 读取数据
infile >> data;
cout << data << endl;
infile >> data;
cout << data << endl;// 关闭文件
infile.close();  

cin.getline( )cin >> 区别

cin.getline( )cin >>
读取方式按行读取 —— 读取输入流中的字符,直到遇到换行符 \n 为止,并将换行符之前的字符存储到目标字符串中。逐个单词读取 —— 读取输入流中的下一个非空白字符,直到遇到空白字符(如空格制表符 \t换行符 \n)为止
前导空白字符从当前输入流的位置开始读取,不跳过前导空白字符跳过输入流前面所有前导空白字符
存储换行符读取到换行符为止,存储换行符之前的字符,并自动处理换行符不会读取换行符
清理缓冲区自动处理换行符,不需要额外清理缓冲区手动清理输入缓冲区中的换行符,如使用 cin.ignore()
用途读取整行文本读取单个单词或数字
理解输入 ABCDEFG\n ,读取 ABCDEFG\n,并自动处理换行符,输入变量值为 ABCDEFG,缓冲区为空输入 ABCDEFG\n ,读取 ABCDEFG,输入变量值为 ABCDEFG,缓冲区为 \n,为避免影响后面的输入,需要手动清理

cin.ignore( ) 的作用

主要用于清除缓冲区中的换行符,以避免影响后续的输入操作,即手动清理缓冲区。对代码:

cout << "Enter your name: ";
cin.getline(data, 100); // 读取姓名
outfile << data << endl;cout << "Enter your age: ";
cin >> data;  // 读取年龄
cin.ignore();  // 清除缓冲区中的换行符
outfile << data << endl;cout << "Enter your address: ";
cin.getline(data, 100);  // 读取地址
outfile << data << endl;

如果移除 cin.ignore() 语句,

  • 缓冲区中的换行符 \n 会被 cin.getline() 读取,导致 data 被赋值为空字符串,该输入被跳过。
  • 文件中写入的内容会变成:
John Doe
25

在这里插入图片描述

如果使用了 cin.ignore()

  • 缓冲区中的换行符会被清除,cin.getline() 会正确读取用户输入的地址。
  • 文件中写入的内容会是:
John Doe
25
Your Address

在这里插入图片描述


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

相关文章

.Net 9下使用Tensorflow.net---DNN_Keras

.Net 9下使用Tensorflow.net---DNN_Keras 1、创建应用&#xff0c;导入依赖2、编写代码1&#xff09;添加引用2&#xff09;创建基础对象3&#xff09;初始化数据集4&#xff09;重点步骤&#xff1a;创建 Keras下的DNN模型5&#xff09;训练模型得到评估值6&#xff09;结果输…

Hadoop第2课(伪分布式集群的搭建)

jdk和hadoop安装包&#xff1a; hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下&#xff08;hadoop用户的主目录&#xff09; 2、解压jdk安装包到~目录 卸载jdk的命令&#xff1a;r…

高清下载油管视频到本地

下载工具并安装: yt-dlp官网地址&#xff1a; GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官网地址&#xff1a; Download FFmpeg 注&#xff1a;记住为其添加环境变量 操作命令&#xff1a; 该指令表示以720p码率下载VIDEO_UR…

ruoyi vue el-elementui el-tree 自适应宽度向左浮动

ruoyi vue el-elementui el-tree 自适应宽度向左浮动 直接上效果图 ,这是根据宽度&#xff0c;向左浮动的 打开的效果&#xff0c;子节点默认不变 &#xff01;&#xff01; &#xff01; &#xff01; &#xff01; &#xff01; &#xff01; 1 &#xff01; &#xff01…

seasms v9 注入漏洞 + order by注入+​information_schema​解决方法

目录 一、当注入时&#xff0c;information_schema被禁用的解决方法 1.通过sys库可以获取到表名和库名 2.通过无列名注入join获取列名 二、seasms v9 注入漏洞 三、order by注入 一、当注入时&#xff0c;information_schema被禁用的解决方法 information_schema数据库是My…

Spring Cloud——路由网关Zuul

??? 哈喽&#xff01;大家好&#xff0c;我是【一心同学】&#xff0c;一位上进心十足的【Java领域博主】&#xff01;??? 【一心同学】的写作风格&#xff1a;喜欢用【通俗易懂】的文笔去讲解每一个知识点&#xff0c;而不喜欢用【高大上】的官方陈述。 【一心同学】博客…

网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析

1. 基本定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09; 应用层协议&#xff0c;用于客户端与服务器之间的数据传输&#xff08;默认端口 80&#xff09;。 HTTP/1.0&#xff1a;早期版本&#xff0c;每个请求需单独建立 TCP 连接&#xff0c;效率低。HTTP/1.1&…

DeepSeek 提示词:基础结构

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…