c - 在 C 中使用 malloc 将文本文件读入数组

标签 c dynamic

我可以用一组(或更多)眼睛来研究这段代码。我正在尝试从文件流 (f1) 读取一定数量的字节到数组/缓冲区(文件是文本文件,数组是 char 类型)。如果我读取大小为“缓冲区 - 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;
}

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

最佳答案

如果您打算为整个文件扩展缓冲区,最简单的方法可能是查找到结尾,获取当前偏移量,然后返回到开头并快速读取:

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

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

关于c - 在 C 中使用 malloc 将文本文件读入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10419913/

相关文章:

c++ - 在C程序中调用C++代码时,`extern“C”`会做什么?

swift - UITextView:达到固定宽度时自动换行

CSS :hover not working on element with dynamically added class

javascript - 从轴坐标动态创建具有整数坐标的有限 n 维坐标系

html - 是否有任何 HTML 元素属性用于提供有关动态内容的信息

Ruby:如何使用带有散列的 'send' 方法调用方法?

c - 我如何修改 Nodo C?

c - 使用openssl(C语言)去除解密结果中的污垢

有人可以使用可视化图表解释 C 中 **param 和 *param 之间的区别吗?

c - 如何使用 Termios 通过 socat 数据传输循环发送字节