文件系统开发--文件流操作
来源:互联网 发布: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);
- 文件系统开发--文件流操作
- 【android开发】文件系统操作
- Day1-文件系统及文件操作
- 文件系统学习4 文件操作
- ios开发之文件系统操作
- IOS开发 沙盒中的文件操作和文件系统NSFilemanager的操作
- Linux 的文件系统以及文件操作
- 文件操作(文件系统设计项目总结)
- 详解ios文件系统文件目录读写操作
- 详解ios文件系统文件目录读写操作
- 实现简单文件系统文件相关操作
- android 文件系统操作 文件读取与写入
- 常用的文件系统操作命令--文件命令
- nodejs-操作文件系统读取写入文件
- php操作服务器文件系统中的文件内容
- 文件操作开发指南
- iOS开发 文件操作
- ios开发 文件操作
- Spring中的资源访问
- php:global变量解析
- Tomcat
- Java生成随机字母和数字
- jQuery中获取其他DOM 节点
- 文件系统开发--文件流操作
- asp常用知识集锦
- Spring + axis2 开发 webservice
- JDK环境变量的配置
- JS 引入 jquery
- dom4j 输出xml时乱码问题
- xp中的DOS出现乱码
- Mathematica的用法
- 开始··