今天看到有同学问如何读写二进制文件,那就顺道讲一下吧。
在Cocoa的世界里,所有与某个物件相关的东西都被该物件实现。好吧,我承认,这句话比较扯…. 还是上例子说明吧。
在通常的编程语言里面(这里指的是C/C++/Java/C#/Ruby/…),以下几个东西是如此关联起来的:
字符串类用来处理字符串存储,查找,替换…等等常规功能。
路径类用来处理所有与文件系统路径相关的事情,比如什么把路径分段,拿到文件扩展名,文件是否存在等等。
目录类则用来看某个路径的目录是否存在,是不是为空,等等。
这里一般会有三个类来处理各自逻辑相关的事情,但是,注意但是,Cocoa里面的构建法则不是这样的,它把所有与字符串相关的功能全部封装到了字符串类里面。
所以,NSString可以做的事情超多,从打开文件读取/写入字符串内容,到判断路径是否存在,等等,所有的事情,它都一手包了。
这样倒是方便程序员了,反正一旦有什么事情和字符串有点关系,找它准没错。
好了,讲了这么一堆,回过头来看这个问题,如何读写二进制文件?我写了各种类型的数据(整形,浮点,字符串)进去,怎么读出来?
这里提到了二进制对吧,也就是数据对吧,那么好了,找NSData就行了。
来看这段小代码,我准备了一个文件路径做演示,还有几个要写进去的数据。
NSString *path = @"/Users/Allen/Desktop/test.dat"; NSString *temp = @"Allen Dang"; int i = 100; float f = 98.3333f;
新建了一个可修改的数据存储器NSMutableData,并把上面的几个数据都加进去,后面直接写入文件。
唯一要注意的只有字符串,因为涉及到编码问题,所以我们必须要用字符串本身的方法拿到根据编码生成出来的数据。
NSMutableData *writer = [[NSMutableData alloc] init]; [writer appendData:[temp dataUsingEncoding:NSUTF8StringEncoding]]; [writer appendBytes:&i length:sizeof(i)]; [writer appendBytes:&f length:sizeof(f)]; [writer writeToFile:path atomically:YES]; [writer release];
别忘了释放用完的东西。
好了,写完成了,让我们看看读。
int ii; float ff; NSString *ttemp; NSData *reader = [NSData dataWithContentsOfFile:path]; ttemp = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])] encoding:NSUTF8StringEncoding]; [reader getBytes:&ii range:NSMakeRange([temp length], sizeof(ii))]; [reader getBytes:&ff range:NSMakeRange([temp length] + sizeof(ii), sizeof(ff))]; NSLog(@"string:%@ int:%i float:%f", ttemp, ii, ff); [temp release]; [ttemp release]; [path release];
看到吧,一样的简单,同样要注意的只有字符串。
好了,相信大家已经知道该怎么做了,我们已经可以玩转任何数据了。
弱弱的问下
为什么读入到rtf文件中
什么也看不见
但能读出来
对于你的问题,我不太理解是什么意思。。。
就是说
我把文件写入到一个“test.rtf”文件中
然后能从中读取信息,并输出到控制台上
但是直接打开该文件“test.rtf”查看时
里面什么也不显示(空白文件)
换成“test.strings”、“test.txt”等多种格式写入都没有显示
能加QQ联系吗?
234871288
补充一下
是对于iphone程序而言
怎么样才能将ttemp = [[NSString alloc] initWithData:[reader subdataWithRange:NSMakeRange(0, [temp length])] encoding:NSUTF8StringEncoding];中的ttemp的输出变成可变长度的阿?要将[temp length]变成什么阿?我不知道[temp length]的类型是什么?不是int的?
今天有朋友遇到.dat文件裡邊包含字典得情況, 用NSData得不到其中內容, 小僧就推薦他過來看看這篇文章…
謝謝博主!