Каким будет наиболее эффективный способ чтения текстового файла в динамический одномерный массив? перераспределение после каждых прочитанных char кажется глупым, перераспределение после каждых строк чтения не кажется намного лучше. Я хотел бы прочитать весь файл в массиве. Как вы это сделаете?
Чтение текстового файла в массив в c
Ответ 1
Я не понимаю, чего вы хотите. Вы хотите постепенно обрабатывать файл, читая одну строку, а затем отказываться от него и обрабатывать следующий? Или вы хотите прочитать весь файл в буфер? Если вы хотите последний, я думаю, что это уместно (проверьте для NULL return для 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
Ответ 2
Если mmap (2) доступно в вашей системе, вы можете открыть файл и перевести его в память. Таким образом, у вас нет памяти для выделения, вам даже не нужно читать файл, система сделает это. Вы можете использовать fseek() trick litb, чтобы получить размер.
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);
EDIT. Для получения размера файла необходимо использовать 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);
Ответ 3
Если вы хотите использовать ISO C, используйте эту функцию.
Это яркий ответ, завернутый с некоторой обработкой ошибок...