c++文件读写
头文件
1 |
- 输入输出流:
std::ifstream
:Input File Stream,用于从文件中读取数据。std::ofstream
:Output File Stream,用于向文件中写入数据。std::fstream
:File Stream,可以同时进行文件的读取和写入。
打开文件
open()
函数
1 | std::ofstream myOutputFile; // 用于写入 |
- 构造函数
1 | std::ofstream myOutputFile("data.txt"); |
- 检查是否打开文件
1 | if (!myOutputFile.is_open()) { |
读写操作
- 可以使用流操作符
1 | // 写入 |
- 也可使用
get()
,getline()
,read()
,write()
等函数。
关闭文件
- 操作完成后,务必关闭文件以释放系统资源,并将缓冲区中的数据全部写入磁盘。
1 | myOutputFile.close(); |
文件打开模式
std::ios::in
- 输入模式:打开文件用于读取数据
std::ios::out
- 输出模式:打开文件用于写入数据 ,默认会清空文件原有内容。
std::ios::app
- 追加模式:从文件末尾开始写入,保留原有内容。必须和
ios::out
配合使用。
- 追加模式:从文件末尾开始写入,保留原有内容。必须和
std::ios::trunc
- 截断模式:如果文件已存在,打开时清空其内容。这是
ios::out
的默认行为。
- 截断模式:如果文件已存在,打开时清空其内容。这是
std::ios::binary
- 二进制模式:以二进制(而不是文本)方式处理文件。
二进制读写
read()
和write()
是为二进制 (Binary) I/O 设计的,处理的是原始字节流。它们不关心数据是什么类型、代表什么意义,只是简单地将内存中的一块数据原封不动地(byte-for-byte)复制到文件,或者从文件复制到内存。
read()
- 原型
1 | istream& read(char* s, std::streamsize n); |
char* s
:这是一个指向内存块起始地址的指针。它告诉read
函数应该把从文件读取的数据存放到哪里。注意这里不是const
,因为read
函数会修改这块内存的内容。std::streamsize n
:要从文件中读取多少个字节。
write()
- 原型
1 | ostream& write(const char* s, std::streamsize n); |
const char* s
:这是一个指向内存块起始地址的指针。它告诉write
函数从哪里开始复制数据。- 因为
char
在 C++ 中被定义为1个字节大小,所以char*
是一个可以指向任何字节序列的通用字节指针。 std::streamsize n
:这是一个整数类型,表示要从起始地址s
开始,连续写入多少个字节。
文件定位
tellg()
- 返回当前读取指针 (get pointer) 的位置(从文件开头计的字节数)。
tellp()
- 返回当前写入指针 (put pointer) 的位置。对于
fstream
,通常读写指针是同步的。
- 返回当前写入指针 (put pointer) 的位置。对于
seekg(offset, dir)
- 移动读取指针到指定位置。
offset
: 偏移量(字节)。dir
: 起始位置。
seekp(offset, dir)
- 移动写入指针到指定位置。参数与
seekg
相同。
- 移动写入指针到指定位置。参数与
dir
(起始位置) 的可能值:std::ios::beg
,从文件开头计算偏移量。std::ios::cur
,从文件当前位置计算偏移量。std::ios::end
,从文件末尾计算偏移量
- 例子
1 | // 将读指针移动到文件开头 |
获取读写大小
- 原型
1 | std::streamsize gcount() const; |
- 返回上一次非格式化输入操作(Unformatted Input Operation)成功读取的字符数。
- 非格式化:像
read()
,getline()
,get()
这样的函数,它们直接处理字符流