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

来源:互联网 发布:mac系统word怎么求和 编辑:程序博客网 时间:2024/05/16 06:18

 

流的读写操作通过基类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);
原创粉丝点击