iPod、iPad、iPhone のシミュレーター 4.3、5.0、5.1、および 6.0 でアプリをテストしました。期待どおりに動作しています。しかし、私のすべてのデバイスでは機能しません。
デバイスでは、ファイル名の大文字と小文字が区別されることを知っています。使用される定数 DATA_FILE と型の両方が小文字であり、開いた後のファイル ハンドルは nil ではありません。ご覧のとおり、適切なファイル配置の後に実際の読み取りはありません。なぜだめですか?
これは、問題を示すために最小限に縮小されたコードです。
NSLog(@"getData, index = %lu", index);
NSFileHandle *fhIndex = [NSFileHandle fileHandleForReadingAtPath: [[NSBundle mainBundle] pathForResource: DATA_FILE ofType:@"idx"]];
u_char indexData[4];
NSLog(@"index*4 = %lu", (index * 4));
[fhIndex seekToFileOffset: (index * 4)];
unsigned long long test = [fhIndex offsetInFile];
NSLog(@"FilePos = %llu",test);
[[fhIndex readDataOfLength: 4] getBytes: indexData length: 4];
test = [fhIndex offsetInFile];
NSLog(@"FilePos = %llu",test);
NSLog(@"indexData = %i %i %i %i", indexData[0], indexData[1], indexData[2], indexData[3]);
インデックス (unsigned long) がルーチンに与えられます。この場合は index=62825 です。プログラムは index*4 の位置にシークし、次の 4 バイトを読み取ります。デバイスでは、これらの 4 バイトは読み取られません!
シミュレーターでのデバッガー出力:
2012-10-31 10:46:24.557 program[469:12003] getData, index = 62825
2012-10-31 10:46:24.559 program[469:12003] index*4 = 251300
2012-10-31 10:46:24.559 program[469:12003] FilePos = 251300
2012-10-31 10:46:24.580 program[469:12003] FilePos = 251304
2012-10-31 10:46:24.581 program[469:12003] indexData = 0 73 130 174
...そしてデバイス上:
2012-10-31 10:41:57.776 program[2942:907] getData, index = 62825
2012-10-31 10:41:57.780 program[2942:907] index*4 = 251300
2012-10-31 10:41:57.782 program[2942:907] FilePos = 251300
2012-10-31 10:41:57.783 program[2942:907] FilePos = 251300
2012-10-31 10:41:57.784 program[2942:907] indexData = 248 10 18 0
デバイスの出力でわかるように、ファイルの位置は読み取り後に変更されていません。つまり、実際には読み取りが行われていません!