Только для чтения "N" байтов из файла в Какао - PullRequest
18 голосов
/ 01 июня 2009

Как читать только "N" байтов из указанного файла?

Ответы [ 4 ]

25 голосов
/ 02 июня 2009

Если вам нужен произвольный доступ к содержимому файла способом, подобным загрузке его через NSData, но без фактического чтения всего в память, вы можете использовать отображение памяти. Это означает, что файл на диске будет рассматриваться как раздел виртуальной памяти и будет выгружаться и выгружаться, как обычная виртуальная память.

NSError * error = nil;
NSData * theData = [NSData dataWithContentsOfFile: thePath
                                          options: NSMappedRead
                                            error: &error];

Если вам не нужна информация об ошибках файловой системы, вы можете просто использовать:

NSData * theData = [NSData dataWithContentsOfMappedFile: thePath];

Тогда вы просто использовали бы метод -getBytes:range: NSData для извлечения определенных фрагментов данных, и только соответствующие части файла фактически будут считываться из постоянного хранилища; они также будут иметь право быть выгруженными тоже.

23 голосов
/ 01 июня 2009

- [NSFileHandle readDataOfLength:] .

NSFileHandle *handle = [NSFileHandle fileHandleForReadingAtPath:filePath];
NSData *fileData = [handle readDataOfLength:N];
[handle closeFile];
2 голосов
/ 01 июня 2009

Если вы хотите избежать чтения всего файла, вы можете просто использовать стандартные функции C I / O:

#include <stdio.h>
...
FILE *file = fopen("the-file.dat", "rb");
if(file == NULL)
    ; // handle error
char theBuffer[1000];  // make sure this is big enough!!
size_t bytesRead = fread(theBuffer, 1, 1000, file);
if(bytesRead < 1000)
    ; // handle error
fclose(file);
0 голосов
/ 01 июня 2009

Открыть файл:

NSData *fileData = [NSData dataWithContentsOfFile:fileName];

Прочитайте байты, которые вы хотите:

int bytes[1000];
[fileData getBytes:bytes length:sizeof(int) * 1000];
...