Android中C++层fstream用法详解

本文介绍了C++中的fstream、ifstream和ofstream类在文件操作中的应用,包括文件的打开、读写位置控制、以及在文件倒数第二行末尾插入数据的方法。特别强调了在处理大数据文件时优化性能的重要性。
摘要由CSDN通过智能技术生成

fstream用于读写文件内容

ifstream用于读文件内容

ofstream用于写内容到文件

读本文章前,请读一下C++ 文件和流 | 菜鸟教程

目录

1. 打开文件open

2.  返回当前指针位置tellg, tellp

3.  设置文件读位置指针seekg

4.  设置文件写位置指针seekp

5. 如何在文件的倒数第二行末尾插入数据


1. 打开文件open

#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. 如何在文件的倒数第二行末尾插入数据

    网上很多方法,都是先读取文件所有内容,保存到一个list中,再在list倒数第二行新增数据,再将这个新的list作为新的内容写入到另一个新文件中,这对于大文件操作时很不友好,影响系统性能。

请注意如果使用seekp写入数据到文件时,写入的数据会覆盖后面的内容。

这适合最后一行规固定的,如果还需要最后一行,那就每次再将最后一行的内容再写入文件即可。

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

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++,可以使用fstream的ifstream、ofstreamfstream三个类来进行文件的输入和输出操作。其,ifstream类用于从文件读取数据,ofstream类用于将数据写入文件,而fstream类则可用于读取和写入文件。 下面是一个简单的例子,演示了如何使用fstream的ofstream类来将数据写入文件: ``` #include <iostream> #include <fstream> using namespace std; int main() { // 创建一个名为myfile.txt的文件,并将数据写入其 ofstream myfile("myfile.txt"); if (myfile.is_open()) { myfile << "Hello, world!" << endl; myfile << "This is a test file." << endl; myfile.close(); } else { cout << "Unable to open file."; } return 0; } ``` 在上面的例子,我们首先创建了一个名为myfile.txt的文件,并将其赋给了ofstream对象myfile。接着,我们使用myfile对象的<<运算符将数据写入文件,并在写入完成后关闭文件。需要注意的是,如果无法打开文件,则应该输出错误信息。 当然,我们也可以使用ifstream类来从文件读取数据,如下所示: ``` #include <iostream> #include <fstream> using namespace std; int main() { // 打开名为myfile.txt的文件,并从读取数据 ifstream myfile("myfile.txt"); if (myfile.is_open()) { string line; while (getline(myfile, line)) { cout << line << endl; } myfile.close(); } else { cout << "Unable to open file."; } return 0; } ``` 在上面的例子,我们首先创建了一个名为myfile.txt的文件,并将其赋给了ifstream对象myfile。接着,我们使用while循环从文件读取数据,并将其输出到控制台上。 需要注意的是,无论是进行文件的输入还是输出操作,都需要在文件操作完成后关闭文件,以释放文件资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值