主页
  • 主页
  • 分类
  • 热文
  • 教程
  • 面试
  • 标签
C++

C++ 基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

C++ 字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

C++ 函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

C++ 面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

C++ 高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

基础

C++ 主页
C++ 概述
C++ 环境
C++ 基本语法
C++ 注释
C++ 数据类型
C++ Hello, World
C++ 省略命名空间
C++ 数值类型
C++ 字符类型
C++ 布尔类型
C++ 变量
C++ 作用域
C++ 多个变量
C++ 输入输出基础
C++ 常量/文字
C++ 修饰符类型
C++ 存储类别
C++ 操作符
C++ 决策结构
C++ 循环结构
C++ foreach 循环
C++ 数字
C++ 数组
C++ 指针
C++ 枚举类型
C++ 引用变量
C++ 日期与时间
C++ 结构体
C++ 联合类型

字符串

C++ 字符串
C++ 字符串长度
C++ 字符串连接

函数

C++ 函数
C++ 多参数函数
C++ 递归
C++ return 语句
C++ 函数重载
C++ 函数重写

面向对象

C++ 面向对象
C++ 类和对象
C++ 多重继承
C++ 多层次继承
C++ 继承
C++ 重载
C++ 多态性
C++ 抽象
C++ 封装
C++ 接口

高级

C++ 文件和流
C++ 异常处理
C++ 动态内存
C++ 命名空间
C++ 模板
C++ 预处理器
C++ 信号量
C++ 多线程
C++ Web 编程
C++ 高级概念

C++ 文件和流


上一章 下一章

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

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

  1. ofstream — 此数据类型代表输出文件流,用于创建文件并将信息写入文件。
  2. ifstream — 此数据类型代表输入文件流,用于从文件读取信息。
  3. fstream — 此数据类型代表一般的文件流,具有 ofstream 和 ifstream 的功能,即它可以创建文件,向文件写入信息以及从文件读取信息。

要在 C++ 中处理文件,你的源文件中必须包含头文件 <iostream> 和 <fstream>。

文件的打开

在你可以从文件读取或写入之前,必须先打开文件。可以使用 ofstream 或 fstream 对象来打开文件以供写入,而 ifstream 对象则用于仅读目的打开文件。

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

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

这里,第一个参数指定了要打开的文件的名称和位置,第二个参数定义了打开文件的模式。

  1. ios::app — 追加模式。所有对该文件的输出都会追加到文件末尾。
  2. ios::ate — 打开文件用于输出并将读/写控制移到文件末尾。
  3. ios::in — 打开文件用于读取。
  4. ios::out — 打开文件用于写入。
  5. ios::trunc — 如果文件已经存在,则在打开文件之前将其内容截断。

你可以组合两个或多个这些值,通过将它们一起 OR。例如,如果你想以写入模式打开一个文件,并且如果该文件已经存在则想将其截断,语法如下:

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

类似地,你可以以读写目的打开一个文件如下:

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

文件的关闭

当 C++ 程序终止时,它会自动刷新所有流,释放所有分配的内存并关闭所有打开的文件。但是,程序员应在程序终止前手动关闭所有打开的文件。

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

void close();

向文件写入

在进行 C++ 编程时,你可以使用流插入运算符(<<)从你的程序向文件写入信息,就像你使用该运算符向屏幕输出信息一样。唯一的区别是你使用 ofstream 或 fstream 对象而不是 cout 对象。

从文件读取

你可以使用流提取运算符(>>)从文件读取信息到你的程序中,就像你使用该运算符从键盘输入信息一样。唯一的区别是你使用 ifstream 或 fstream 对象而不是 cin 对象。

读写示例

以下是一个 C++ 程序,它以读写模式打开一个文件。在将用户输入的信息写入名为 afile.dat 的文件后,程序从文件读取信息并在屏幕上输出:

#include <fstream>
#include <iostream>
using namespace std;

int main () {
   char data[100];

   // 以写模式打开一个文件。
   ofstream outfile;
   outfile.open("afile.dat");

   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();

   // 以读模式打开一个文件。
   ifstream infile;
   infile.open("afile.dat");
 
   cout << "Reading from the file" << endl;
   infile >> data;

   // 在屏幕上显示数据。
   cout << data << endl;
   
   // 再次从文件读取数据并显示。
   infile >> data;
   cout << data << endl;

   // 关闭打开的文件。
   infile.close();

   return 0;
}

当上述代码被编译和执行时,它产生了如下示例输入和输出:

$ ./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

以上示例使用了来自 cin 对象的附加函数,如 getline() 函数用于从外部读取一行,ignore() 函数用于忽略前一条读取语句留下的额外字符。

文件位置指针

istream 和 ostream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数是 seekg(用于 istream)和 seekp(用于 ostream)。

seekg 和 seekp 的参数通常是长整型。可以指定第二个参数来指示搜索方向。搜索方向可以是 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 );
上一章 下一章
阅读号二维码

关注阅读号

联系二维码

联系我们

© 2024 Yoagoa. All rights reserved.

粤ICP备18007391号

站点地图