2

このコードは 2 つのファイルをロードし、それらをバイトごとに比較して差分を出力するはずですが、何らかの理由で同じファイルが使用されていても差分を出力し、私の書式設定を無視しているようです。

どんな助けでも大歓迎です。

ありがとう。

int main(int argc, const char * argv[])
{
    @autoreleasepool {
    NSString *pathA = [[NSBundle mainBundle] pathForResource:@"original/testfile" ofType:@""];
    NSFileHandle *fileA = [NSFileHandle fileHandleForReadingAtPath:pathA];
    NSString *pathB = [[NSBundle mainBundle] pathForResource:@"updated/testfile" ofType:@""];
    NSFileHandle *fileB = [NSFileHandle fileHandleForReadingAtPath:pathB];
    unsigned long long sizeofFile = [fileA seekToEndOfFile];
    [fileA seekToFileOffset:0];
    [fileB seekToFileOffset:0];
    unsigned int fileaValue;
    unsigned int filebValue;
    for (int i = 0; i <= sizeofFile; i++) {
        [[fileA readDataOfLength:1] getBytes:&fileaValue];
        [[fileB readDataOfLength:1] getBytes:&filebValue];
        if (fileaValue != filebValue)
            NSLog(@"File A %02x File B %02x at offset %u:",fileaValue,filebValue,i);
    }
    [fileA closeFile];
    [fileB closeFile];
    }
return 0;
}

出力例

 2013-03-13 13:50:50.580 compareFile[12055:303] File A 7fce File B 5fbff9ce at offset 0:
 2013-03-13 13:50:50.581 compareFile[12055:303] File A 7ffa File B 5fbff9fa at offset 1:
4

1 に答える 1

1

問題はおそらく、選択したデータ型 (1 バイトが必要な場合は を使用uint8_t) であり、ほぼ確実<=forループ内での使用であると思います。

uint8_t fileaValue;
uint8_t filebValue;
for (unsigned i = 0; i < sizeofFile; i++) {   // NOT <=
    [[fileA readDataOfLength:1] getBytes:&fileaValue];
    [[fileB readDataOfLength:1] getBytes:&filebValue];
    if (fileaValue != filebValue)
        NSLog(@"File A %02x File B %02x at offset %u:", (unsigned)fileaValue, (unsigned)filebValue,i);
}

NSLog()(値を正しく出力するための呼び出しのキャストに注意してください)。

readDataOfLengthまた、ファイル I/O がエラーの一般的な原因である場合、その成功を順番にチェックします。

于 2013-03-13T13:59:43.313 に答える