如何将文本文件最有效地读入动态一维数组中?在每次读取字符后重新分配内存看起来很愚蠢,每次读取行后重新分配内存也不会好多少。我想将整个文件读入数组中,请问应该如何处理?
我不太明白你想要什么。你想逐行处理文件,读一行然后放弃它并处理下一行吗?还是你想将整个文件读入缓冲区?如果你想要后者,我认为这是合适的(在实际代码中检查malloc和fopen的NULL返回值以确定文件是否存在和是否获得足够的内存):
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
sizeof(char)
被定义为1,因此没有区别。第二个问题:不,你应该逐步阅读它(比如逐行或其他分段方法)。否则,你的内存很快就会耗尽。 - Johannes Schaub - litbvoid *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);
fstat(2)
函数:struct stat S; fstat(fd, &S);
,然后 int nbytes = S.st_size
是以字节为单位的文件大小,直接从文件系统中获取,而不需要读取文件(这无疑会得到与上面相同的结果;我主要是为了完整性而提及它)。 - Norman Gray