👻 概念
文件流输出使用标准库 fstream
,定义三个新的数据类型:
数据类型 | 描述 |
---|---|
ofstream | 输出文件流,用于创建文件并向文件写入信息。 |
ifstream | 输入文件流,用于从文件读取信息。 |
fstream | 文件流,且同时具有 ofstream 和 ifstream 两种功能,意味着可以创建文件,写入信息,读取信息 |
👻 准备工作
- 使用文件流需要包含
<iostream>
和<fstream>
头文件
#include <fstream>
#include <iostream>
👻 打开文件
👾语法格式
使用 open()
函数打开文件,是 fstream
、ifstream
、ofstream
对象的成员
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()
函数打开文件,是 fstream
、ifstream
、ofstream
对象的成员。
程序终止时,会自动关闭刷新所有流,释放所有分配的内存,并关闭所有打开的文件
void close();
👾示例代码
outfile.close();
👻 写入文件
👾语法格式
使用流插入运算符 <<
向文件写入信息,使用的是 ofstream
或 fstream
对象
ofstream << data;
👻 读取文件
👾语法格式
使用流提取运算符 >>
向文件写入信息,使用的是 ifstream
或 fstream
对象
ifstream >> data;
👻 文件位置指针
👾语法格式
使用 istream
的 seekg
(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