1

2つの質問があります。

  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];

そして、それは回答者からの素敵な警告が付属しています:

stdioはキャッシュするため、fpから読み取らないように注意してください。

編集:NSDataへのvoid *に関しては、私はあなたが欲しいと思います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 に答える