чтение текстового файла в массив в c - PullRequest
18 голосов
/ 04 января 2009

Каков был бы наиболее эффективный метод чтения текстового файла в динамический одномерный массив? переопределение после каждого чтения символа кажется глупым, переопределение после каждой строки чтения не кажется намного лучше. Я хотел бы прочитать весь файл в массив. Как бы вы это сделали?

Ответы [ 3 ]

26 голосов
/ 04 января 2009

Я не совсем понимаю, чего вы хотите. Вы хотите постепенно обработать файл, прочитав одну строку из него, затем отказаться от него и обработать следующую? Или вы хотите прочитать весь файл в буфер? Если вы хотите последнее, я думаю, что это уместно (проверьте наличие NULL для malloc и fopen в реальном коде, чтобы определить, существует ли файл и достаточно ли у вас памяти):

FILE *f = fopen("text.txt", "rb");
fseek(f, 0, SEEK_END);
long pos = ftell(f);
fseek(f, 0, SEEK_SET);

char *bytes = malloc(pos);
fread(bytes, pos, 1, f);
fclose(f);

hexdump(bytes); // do some stuff with it
free(bytes); // free allocated memory
13 голосов
/ 04 января 2009

Если в вашей системе доступно mmap (2) , вы можете открыть файл и отобразить его в памяти. Таким образом, у вас нет памяти для выделения, вам даже не нужно читать файл, система сделает это. Вы можете использовать трюк fseek (), который дал литб, чтобы получить размер .

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

РЕДАКТИРОВАТЬ : Вы должны использовать lseek(), чтобы получить размер файла,.

int fd = open("filename", O_RDONLY);
int nbytes = lseek(fd, 0, SEEK_END);
void *content = mmap(NULL, nbytes, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
1 голос
/ 04 января 2009

Если вы хотите использовать ISO C, используйте эту функцию .

Это ответ Литба, завернутый с некоторой обработкой ошибок ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...