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

👻 概念

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

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

👻 准备工作

  • 使用文件流需要包含 <iostream><fstream> 头文件
c++ 复制代码
#include <fstream>
#include <iostream>

👻 打开文件

👾语法格式

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

c++ 复制代码
void open(const char *filename, ios::openmode mode);
  • 参数 filename ------ 打开文件的名称和位置

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

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

👾示例代码

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

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

    c++ 复制代码
    ifstream infile;
    infile.open("file.dat", ios::out | ios::in );

👻 关闭文件

👾语法格式

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

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

c++ 复制代码
void close();

👾示例代码

c++ 复制代码
outfile.close();

👻 写入文件

👾语法格式

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

c++ 复制代码
ofstream << data;

👻 读取文件

👾语法格式

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

c++ 复制代码
ifstream >> data;

👻 文件位置指针

👾语法格式

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

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

    c++ 复制代码
    istream& seekg(streamoff off, ios::seekdir dir);
    ostream& seekp(streamoff off, ios::seekdir dir);
  • 参数 off ------ 偏移量(正数/负数)

  • 参数 dir ------ 定位方向

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

👾示例代码

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

c++ 复制代码
// 定位到 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);

👻 综合实例

c++ 复制代码
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();  
c++ 复制代码
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( ) 的作用

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

cpp 复制代码
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

相关推荐
Dovis(誓平步青云)1 小时前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
KyollBM2 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
feiyangqingyun2 小时前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
CV点灯大师2 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
成工小白3 小时前
【C++ 】智能指针:内存管理的 “自动导航仪”
开发语言·c++·智能指针
sc写算法3 小时前
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
开发语言·c++·json
SunkingYang3 小时前
C++中如何遍历map?
c++·stl·map·遍历·方法
Andrew_Xzw3 小时前
数据结构与算法(快速基础C++版)
开发语言·数据结构·c++·python·深度学习·算法
库库的里昂3 小时前
【C++从练气到飞升】03---构造函数和析构函数
开发语言·c++
momo卡3 小时前
MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)
c语言·c++·windows