2012-04-14 6 views
1

私には2つの質問があります。C型をObjective-Cオブジェクトに変換する

  1. FILE *インスタンスを使用してNSFileHandleオブジェクトを作成する方法はありますか?

  2. void *インスタンスを使用してNSDataオブジェクトを作成する方法は?

ご迷惑をおかけして申し訳ございません。

最近の質問を参照してください。 Weird behavior of fopen on iosネイティブfopen関数を使ってコンテンツを作成したり、ファイルに書き込んだりすることはできません。

その結果、iosフレームワークでapiを使用し、fopenとfwriteのコードとそのスタッフをラップするだけです。ですから、私はFILE *オブジェクトをNSFileHandleまたはファイルを操作できるものに変換する必要があります。また、void *で処理されるコンテンツは、iosフレームワークで受け入れることができるデータ形式に変換する必要があります。 NSDataが選択肢になるはずです。あなたはたとえば、Cで行うよう

+2

さらに詳しい情報がありますか?コンテキスト? – Sirens

+0

@TheDeveloper申し訳ありませんが、質問を更新しました。 – seanxiaoxiao

答えて

3

をFILEを使用することができ、私は完全にあなたが必要なものと一致し、このmailing list質問を見つけました。関連コード:

FILE *fp; 
NSFileHandle *p; 

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

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

stdioのキャッシュので、FPから読まないように注意してください。

EDIT:void *をNSDataに変換すると、NSData's -initWithBytesNoCopy:Length:freeWhenDone:と思っています。使用方法についてはrelated questionを参照してください。

+0

これは参考になると思います。私はまず試してみる。 – seanxiaoxiao

0

あなただけ... * NSFileHandleへのファイル*については

- (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)]; 
} 
+0

私はこのように自分の問題を解決しようとしました。しかし、fwriteが呼び出すと、エラーログが表示され、無効なサンドボックスが表示されました。どうしてか分かりません。 – seanxiaoxiao

+0

私はこのプロジェクトを私のプロジェクトから切り捨てました。それは長い間うまくいきました。私はあなたの他のスレッドを見た。おそらく、ファイルシステム文字列を作成するための適切な方法を使用していなかったようです。 –

+0

ありがとうジョディ、私は試していた。 – seanxiaoxiao

関連する問題