使用C语言中的malloc将文本文件读入数组

MCP*_*MCP 2 c dynamic

我可以在这段代码上使用一组眼睛(或更多).我正在尝试从文件流(f1)到数组/缓冲区读取一定量的字节(文件是文本文件,数组是char类型).如果我读入大小"buffer - 1",我想"重新分配"数组并继续读取,从我离开的地方开始.基本上我正在尝试为未知大小的文件动态扩展缓冲区.我想知道的是:

  1. 我是否实施了这个错误?
  2. 如何使用代码检查"realloc"之类的故障情况?
  3. 当我编译"内置函数realloc的隐式声明......"时,我收到了很多警告(我也看到了使用read,malloc,strlen等的警告.
  4. 当"read()"第二次被调用(第三次,第四次等)时,它是否每次从流的开头读取?这可能是我的问题,我似乎只返回第一个"buff_size"字符.

这是片段:

//read_buffer is of size buff_size
n_read = read(f1, read_buffer, buff_size - 1);
read_count = n_read;
int new_size = buff_size;
while (read_count == (buff_size - 1))
{

        new_size *= 2;
        read_buffer = realloc(read_buffer, new_size);
        n_read = read(f1, read_buffer[read_count], buff_size - 1);
        read_count += n_read;
}
Run Code Online (Sandbox Code Playgroud)

当我正在学习如何进行这种类型的动态读取时,我想知道是否有人可以通过这类事情陈述一些关于最佳实践的简要事实.我假设这在专业领域出现了TON(阅读未知大小的文件)?谢谢你的时间.另外:当你们找到好的做事方式(即针对这类问题的技巧)时,你是否发现自己记忆如何做到这一点,或者将其保存以供将来参考(即解决方案是否相当静态)?

Jer*_*fin 6

如果你打算扩展整个文件的缓冲区,最简单的方法就是找到最后的,得到当前的偏移,然后回到开头并读取:

size = lseek(f1, 0, SEEK_END); // get offset at end of file

lseek(f1, 0, SEEK_SET); // seek back to beginning

buffer = malloc(size+1); // allocate enough memory.

read(f1, buffer, size);  // read in the file
Run Code Online (Sandbox Code Playgroud)

或者,在任何合理的现代POSIX类系统上,考虑使用mmap.