在本章中,我们将详细探讨如何使用 C++ 处理文件和输入输出流。C++ 提供了强大的标准库支持,使得文件操作变得简单而高效。
文件流概述
文件流是 C++ 中用于读写文件的类。主要的文件流类包括 std::ifstream
、std::ofstream
和 std::fstream
。这些类分别用于文件的输入、输出和双向操作。
std::ifstream 类
std::ifstream
类用于从文件中读取数据。它继承自 std::istream
类。
创建文件流对象
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- ------------------------- -- ---- -- ------------ - -- ---------- --------- -- -------- -- ---------- ------ -- - -- ------ -
读取文件内容
-- -------------------- ---- ------- -------- --------- -------- ---------- -------- -------- --- ------ - ------------- ------------------------- -- ------------ - --------- -- -------- -- ---------- ------ -- - ----------- ----- ----- ------------------- ------ - -- -- ------- -------- --------- -- ---- -- ---------- - ------------------ -- ---- ------ -- -
std::ofstream 类
std::ofstream
类用于向文件写入数据。它继承自 std::ostream
类。
创建文件流对象
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- ------------------------- -- ------- -- ------------- - -- ---------- --------- -- -------- -- ---------- ------ -- - -- ------ -
向文件写入数据
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- ------------------------- -- ------------- - --------- -- -------- -- ---------- ------ -- - ---------- -- ------- ------- -- ---------- -- -------- ---------- -- --- -- ---------- -- ------- ------------------- -- ---- ------ -- -
std::fstream 类
std::fstream
类用于同时进行文件的读写操作。它继承自 std::iostream
类。
创建文件流对象
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------ ------------------------- ------------ - --------------- -- -------- -- ------------- - --------- -- -------- -- ---------- ------ -- - -- ------ -
文件的读写操作
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------ ------------------------- ------------ - --------------- -- ------------- - --------- -- -------- -- ---------- ------ -- - ----------- -------- ------------------- --------------- -- ------- --- ------ - ------------------- -- ------ ------------------- --------------- -- ------- ----------------------- -- -------------- ---------------------------- -------- -- ------ --------- -- ------- -- ---------- --------- -- ------- -- ---------- ------------------- -- ------ ------------------- --------------- -- ------- ---------- -- ---------- -- --------- ------------------- ------ -- -
文件流操作符重载
C++ 的文件流类提供了许多操作符重载,使得文件操作更加方便。
读取和写入基本类型
文件流可以自动处理基本类型的读写操作,如整型、浮点型等。
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- -------------------------- -- ------------- - --------- -- -------- -- ---------- ------ -- - --- ------ - --- ---------- -- ------ -- ---------- -- ---- ------ ----- - ----- ---------- -- ----- -- ---------- -- ----- ------------------- ------------- ------------------------- -- ------------ - --------- -- -------- -- ---------- ------ -- - --- ----------- --------- -- ----------- -- ---- --------- -- ------- - -- ---------- -- ---------- ------ ---------- --------- -- ---------- -- ----- --------- -- -------- - -- --------- -- ---------- ------------------ ------ -- -
使用 getline 读取字符串
getline
函数可以从文件流中读取一行文本,并将其存储在一个字符串变量中。
-- -------------------- ---- ------- -------- --------- -------- ---------- -------- -------- --- ------ - ------------- ----------------------- -- ------------- - --------- -- -------- -- ---------- ------ -- - ---------- -- ------- ---- -- ---------- ---------- -- -------- -- ---- ---- -- ---------- ------------------- ------------- ---------------------- -- ------------ - --------- -- -------- -- ---------- ------ -- - ----------- ----- ----- ------------------- ------ - --------- -- ---- -- ---------- - ------------------ ------ -- -
文件模式
C++ 文件流提供了多种打开文件的模式,通过组合这些模式,可以灵活地控制文件的操作行为。
文件打开模式
std::ios::in
: 仅用于读取。std::ios::out
: 仅用于写入。std::ios::app
: 在文件末尾追加内容。std::ios::ate
: 打开文件后立即定位到文件末尾。std::ios::trunc
: 如果文件已存在,则删除其内容。std::ios::binary
: 以二进制模式打开文件。
示例:组合模式
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- --------------------- ------------- - --------------- -- --------- -- ------------- - --------- -- -------- -- ---------- ------ -- - ---------- -- -------- -- ---------- ------------------- ------ -- -
错误处理
文件操作可能由于各种原因失败,因此需要妥善处理错误情况。
检查文件打开状态
可以通过检查文件流的状态标志来判断文件操作是否成功。
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- ------------------------- -- ------------ - --------- -- -------- -- ---------- ------ -- - ----------- ----- ----- ------------------- ------ - --------- -- ---- -- ---------- - ------------------ ------ -- -
清除状态标志
在某些情况下,可能需要清除文件流的状态标志,以便继续操作。
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------ ------------------------- ------------ - --------------- -- ------------- - --------- -- -------- -- ---------- ------ -- - ---------- -- ------- ------- -- ---------- ------------------- -- ------ ------------------- --------------- -- ------- ----------- -------- ----- -------------------- --------- - --------- -- ------- -- ---------- - ------------------- ------ -- -
文件缓冲
C++ 文件流默认使用缓冲机制,以提高性能。可以手动控制缓冲行为,例如刷新缓冲区。
刷新缓冲区
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- ------------------------- -- ------------- - --------- -- -------- -- ---------- ------ -- - ---------- -- ----- -- ---------- ------------------- -- ----- ---------- -- ----- -- ---------- ------------------- ------ -- -
禁用缓冲
可以通过设置文件流为无缓冲模式来禁用缓冲。
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - ------------- ------------------------ ------------- - ------------------ -- ------------- - --------- -- -------- -- ---------- ------ -- - -------------------------------------- --- -- ---- ---------- -- ----------- -- ---------- ------------------- ------ -- -
总结
本章介绍了 C++ 中文件和流的基本概念及操作方法。通过学习这些内容,你将能够有效地处理文件输入输出任务,从而增强你的程序功能。下一部分我们将探讨更高级的文件操作技术,包括内存映射文件和多线程文件访问等主题。