您的位置:首页 > 其它

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

2010-03-30 13:06 330 查看
流的读写操作通过基类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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: