fstream用于读写文件内容
ifstream用于读文件内容
ofstream用于写内容到文件
读本文章前,请读一下C++ 文件和流 | 菜鸟教程
目录
[1. 打开文件open](#1. 打开文件open)
[2. 返回当前指针位置tellg, tellp](#2. 返回当前指针位置tellg, tellp)
[3. 设置文件读位置指针seekg](#3. 设置文件读位置指针seekg)
[4. 设置文件写位置指针seekp](#4. 设置文件写位置指针seekp)
[5. 如何在文件的倒数第二行末尾插入数据](#5. 如何在文件的倒数第二行末尾插入数据)
1. 打开文件open
cpp
#include <iostream>
#include <fstream>
fstream ooStream;
ooStream.open("file.json", ios::out | ios::in);
if (!ooStream.is_open()) {
//文件打开失败
ALOGD("Can not open file");
} else {
//文件打开成功
ALOGD("open sccuess!");
}
ooStream.close();
open函数如下
void open(const char *filename, ios::openmode mode);
mode有以下几种类型
ios::in = 0x01, //供读,文件不存在则创建(ifstream默认的打开方式)
ios::out = 0x02, //供写,文件不存在则创建,若文件已存在则清空原内容(ofstream默认的打开方式)
ios::ate = 0x04, //文件打开时,指针在文件最后。可改变指针的位置,常和in、out联合使用
ios::app = 0x08, //供写,文件不存在则创建,若文件已存在则在原文件内容后写入 新的内容,指针位置总在最后
ios::trunc = 0x10, // 在读写前先将文件长度截断为0(默认)
ios::nocreate = 0x20, //文件不存在时产生错误,常和in或app联合使用
ios::noreplace = 0x40, //文件存在时产生错误,常和out联合使用
ios::binary = 0x80 //二进制格式文件
2. 返回当前指针位置tellg, tellp
g --- get
p --- put
tellg 和 tellp 函数不需要带参数,它返回当前定位指针的位置,也代表着输入流的大小.
3. 设置文件读位置指针seekg
g --- get
// 定位到 ooStream的第 n 个字节(假设是 ios::beg)
ooStream.seekg(n);
// 定位到 ooStream的开头
ooStream.seekg( 0, ios::beg);
// 把文件的读指针从 ooStream开头向后移 n 个字节
ooStream.seekg( n, ios::beg);
// 把文件的读指针从 ooStream当前位置cur向后移 n 个字节
ooStream.seekg( n, ios::cur );
// 把文件的读指针从 ooStream末尾往前移 n 个字节
ooStream.seekg( n, ios::end );
// 定位到 ooStream的末尾
ooStream.seekg( 0, ios::end );
4. 设置文件写位置指针seekp
p --- put
// 定位到 ooStream的第 n 个字节(假设是 ios::beg)
ooStream.seekp(n);
// 把文件的写指针从 ooStream开头向后移 n 个字节
ooStream.seekp( n, ios::beg);
// 把文件的写指针从 ooStream末尾往前移 n 个字节
ooStream.seekp( n, ios::end );
5. 如何在文件的倒数第二行末尾插入数据
请注意如果使用seekp写入数据到文件时,写入的数据会覆盖后面的内容。
cpp
void writeDataToFile() {
fstream ooStream;
//由于是插入到指定位置,所以此处不能是ios::app
ooStream.open("file.json", ios::out | ios::in);
if (!ooStream.is_open()) {
//文件打开失败
ALOGD("Can not open file");
return;
} else {
ALOGD("open sccuess!");
}
//将文件读指针定位到文件末尾,假设文件末尾没有\n
ooStream.seekg(0, ios::end);
//获取文件大小
std::streampos fileSize = ooStream.tellp();
long pos = (long)fileSize;
while (pos > 0) {
//每次减1,往前移动,寻找\n
ooStream.seekg(--pos);
char c;
//获取ooStream当前的字符是什么
ooStream.get(c);
//判断ooStream当前的字符是否是回车符
if (c == '\n') {
//是回车符,则退出循环,这就到了倒数第二行的末尾,注意倒数第一行没有回车符
break;
}
}
//将文件的写指针定位到pos,即第二行文件末尾
ooStream.seekp(pos);
//写数据
ooStream << "write data";
//关闭文件流
ooStream.close();
}