1

我有两个问题。

  1. 如何使用 FILE* 实例创建 NSFileHandle 对象?

  2. 如何使用 void* 实例创建 NSData 对象?

很抱歉,没有上下文的信息很少。

只需参考我最近的问题。ios 上 fopen 的奇怪行为我无法使用本机 fopen 函数来创建内容或将内容写入文件。

结果我只想用ios框架里面的api,把fopen和fwrite之类的代码封装起来。所以我应该将 FILE* 对象转换为 NSFileHandle 或可以操作文件的东西。用 void* 处理的内容也应该转换为 ios 框架可以接受的数据格式。我认为 NSData 应该是选择。

4

2 回答 2

3

至于 FILE* 到 NSFileHandle,我发现这个邮件列表问题完全符合您的需要。相关代码:

FILE *fp;
NSFileHandle *p;

fp = fopen( "foo", "r");
p = [[[NSFileHandle alloc] initWithFileDescriptor:fileno( fp)
closeOnDealloc:YES] autorelease];

它带有来自回答者的可爱警告:

注意不要从 fp 读取,因为 stdio 缓存。

编辑:至于 void* 到 NSData,我想你想要NSData's -initWithBytesNoCopy:Length:freeWhenDone:. 请参阅有关如何使用它的相关问题。

于 2012-04-14T04:17:09.930 回答
0

您可以像在 C 中一样使用 FILE*。例如...

- (id)initWithFileUrl:(NSURL *)url
{
    if (self = [super init]) {
        NSFileManager *fileManager = [[NSFileManager alloc] init];
        [fileManager createDirectoryAtPath:[[url path] stringByDeletingLastPathComponent] withIntermediateDirectories:YES attributes:nil error:0];

        char const *path = [fileManager fileSystemRepresentationWithPath:url.path];
        fp = fopen(path, "a");
        if (!fp) {
            [NSException raise:@"Can't open file for recording: " format:@"%s", strerror(errno)];
        }

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:[UIApplication sharedApplication]];
    }
    return self;
}
- (void)writeBytes:(void const *)bytes length:(uint32_t)size
{
    if (fp && fwrite(bytes, size, 1, fp) != 1) {
        [NSException raise:@"File Write Error" format:@"%s", strerror(errno)];
    }
}
- (void)writeBytes:(void const *)bytes andSize:(uint32_t)size
{
    if (!fp) return;
    if (fwrite(&size, sizeof size, 1, fp) != 1 || fwrite(bytes, size, 1, fp) != 1) {
        [NSException raise:@"File Write Error" format:@"%s", strerror(errno)];
    }
}
- (void)writeInt32:(int32_t)value
{
    [self writeBytes:&value length:sizeof value];
}
- (void)writeInt64:(int64_t)value
{
    [self writeBytes:&value length:sizeof value];
}
- (void)writeData:(NSData *)data
{
    [self writeBytes:data.bytes andSize:data.length];
}
- (void)writeCGFloat:(CGFloat)value
{
    [self writeBytes:&value length:sizeof value];
}
- (void)writeCGPoint:(CGPoint)point
{
    [self writeBytes:&point length:sizeof(point)];
}
于 2012-04-14T04:15:45.640 回答