Android中C++层fstream用法详解

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();
}
相关推荐
逐光沧海4 分钟前
数据结构基础--蓝桥杯备考
数据结构·c++·算法·蓝桥杯
前进的程序员7 分钟前
嵌入式开发中 C++ 跨平台开发经验与解决方案
开发语言·c++
菜一头包28 分钟前
c++ std库中的文件操作学习笔记
c++·笔记·学习
飞猿_SIR2 小时前
Android Exoplayer 实现多个音视频文件混合播放以及音轨切换
android·音视频
HumoChen992 小时前
GZip+Base64压缩字符串在ios上解压报错问题解决(安卓、PC模拟器正常)
android·小程序·uniapp·base64·gzip
吃个早饭2 小时前
2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解
c语言·c++·蓝桥杯
阿沁QWQ3 小时前
单例模式的两种设计
开发语言·c++·单例模式
六bring个六3 小时前
qtcreater配置opencv
c++·qt·opencv·计算机视觉·图形渲染·opengl
qwertyuiop_i3 小时前
pe文件二进制解析(用c/c++解析一个二进制pe文件)
c语言·c++·pe文件
yxc_inspire4 小时前
基于Qt的app开发第八天
开发语言·c++·qt