文件系统开发--文件流操作

本文介绍SymbianOS中文件流操作的基本方法,包括使用RFileWriteStream类进行文件写入,以及使用RFileReadStream类进行文件读取的过程。文章详细说明了如何创建文件流、写入数据、提交更改及释放资源等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

流的读写操作通过基类RReadStream类和RWriteStream类实现。例如CommitL()函数用于最终写入数据,WriteL()函数用于外部化数据,ReadL()函数用于内部化数据。根据不同的媒体,又有不同的派生类,读写文件流的派生类是RFileReadStream类和RWriteFileStream类。写入文件流时,需要使用RFileWriteStream::Create()函数创建文件,从文件流读取数据时需要使用RFileReadStrea::Open()函数打开文件。

 

Symbian OS 中的大部分文件操作的函数都不会异常退出,而是返回错误值。所以当某些操作的错误影响之后的程序时,需要使用User::LeaveIfError()函数强行异常退出。将RWriteStream类及其派生类的对象压入清除栈时,不要使用清除栈的PushL()函数,而是用该类对象的PushL()函数。使用RFileWriteStream将一个TInt16类型的值写入流中的参考代码如下:

 

void WriteToStreamFileL(RFs& aFs,TDesC& aFileName,TInt16* aInt)

 

 

RFileWriteStream write;

 

//使用RWriteStream::PushL(),而不是清除栈的PushL()

 

writer.PushL();

 

User::LeaveIfError(writer.Create(aFs,aFileName,EFileWriter));

 

writer<<*aInt;

 

//CommitL()之后,数据不能rollback

 

writer.CommitL();

 

//使用RWriteStream::Pop(),而不是清除栈的Pop()

 

writer.Pop();

 

//使用Release函数释放RWriteStream

 

writer.Release();

 

 

弹出清除栈时,可以使用对象的Pop()函数,然后使用Release()函数释放RWriteStream类的对象。也可以使用清除栈的PopAndDestroy()函数弹出并销毁该对象。这一规则也适用于RReadStream类,使用RReadStream类从stream中读取一个TInt16值的代码如下:

 

void ReadFromStreamFileL(RFs& aFs,TDesC& aFileName,TInt16* aInt)

 

 

RFileReadStream reader;

 

//使用RReadStream::PushL函数压入清除栈

 

reader.PushL();

 

User::LeaveIfError(reader.Open(aFs,aFileName,EFileRead));

 

reader>>*aInt;

 

//使用清除栈的函数弹出并销毁RFileReadStream对象

 

//该语句的作用域{reader.Pop();reader.Release();}相同

 

CleanupStack::PopAndDestroy(); //reader

 

 

前面的代码中使用了操作符<<完成数据的外部化,使用>>完成数据的内部化。

 

为了保证流的顺序不受影响,一定要确保读写时指定的操作数长度和次序相同,例如:

 

TInt i = 1234;

 

TInt32 j = 5678;

 

writer.WriteInt32L(i);

 

writer<<j;

 

....

 

i = reader.ReadInt32L(i);

 

reader>>j;

 

使用操作符<<将字符串外部化到流中时,不再要求字符串是8位的,也不限制字符串的长度,操作符<<会在流中记录这些信息,以保障内部化的时候可以正确读出字符串的内容。

 

_LIT(KSampleText,"Hello World");

 

TBuf<20> text = KSampleText;

 

writer<<text;

 

...

 

TBuf<20> text2;

 

reader>>text2;

 

对于任何类型的一个类,例如“T”类型的类,“C”类型的类或者一个独立的类,需要实现ExternalizeL()函数和InternalizeL()函数,之后可以使用操作符“<<”和“>>”写读该类对象中的数据到流中。例如:

 

class AnyClass

 

 

public:

 

...

 

void ExternalizeL(RWriteSteam& aStream)

 

 

aSteam<<iText;

 

aStream<<iInt;

 

aStream<<iReal;

 

 

void InterlizeL(RReadStream& aStream)

 

 

 

aSteam>>iText;

 

aStream>>iInt;

 

aStream>>iReal;

 

 

private:

 

TBuf<32> iText;

 

TInt32 iInt;

 

TReal64 iReal;

 

 

外部化和内部化AnyClass类的对象时,可以使用操作符“<<”和“>>”

 

AnyClass object;

 

writer<<object;

 

...

 

AnyClass object2;

 

reader>>object2;

 

或者直接使用ExternalizeL()函数和Internalize()函数,运行效果一样

 

AnyClass object;

 

object.ExternalizeL(writer);

 

...

 

AnyClass object2;

 

object2.InternalizeL(reader);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值