如何向malloc分配的字符串末尾追加字符并动态扩容文件读取缓冲区
动态缓冲区追加内存实现方案
核心思路是使用realloc函数按需扩展缓冲区容量,同时跟踪缓冲区的已用字节数和总容量,避免内存溢出和频繁扩容带来的性能损耗。
具体实现步骤
- 定义三个核心变量跟踪缓冲区状态:
- 缓冲区总容量
capacity:初始设为你定义的bufferSize - 已写入缓冲区的有效字节数
used:初始值为0 - 单次
read调用的返回值read_cnt:用于判断读取结果
- 缓冲区总容量
- 每次调用
read时,传入的读取长度为capacity - used,仅读取当前缓冲区剩余空闲空间能容纳的字节数,避免越界 - 每次读取完成后遍历本次新增的字节,检查是否存在目标字符
.:- 找到
.:直接终止循环,可在目标位置后补\0将缓冲区内容转为合法C字符串 - 未找到
.且缓冲区已被填满:调用realloc扩容,通常每次扩容为原容量的1.5~2倍,减少后续扩容次数
- 找到
- 注意
realloc的安全用法:先用临时指针接收返回值,确认扩容成功后再赋值给原缓冲区指针,避免扩容失败导致原有内存泄漏
示例代码
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #define INIT_BUFFER_SIZE 1024 // 初始缓冲区大小可自定义 int find_dot_in_file(int fd) { size_t capacity = INIT_BUFFER_SIZE; size_t used = 0; char *buffer = malloc(capacity * sizeof(char)); if (buffer == NULL) { perror("malloc failed"); return -1; } ssize_t read_cnt; while ((read_cnt = read(fd, buffer + used, capacity - used)) > 0) { // 遍历本次新读入的内容找'.' for (size_t i = used; i < used + read_cnt; i++) { if (buffer[i] == '.') { // 找到目标字符,按需处理,此处示例补\0后打印 buffer[i + 1] = '\0'; printf("找到'.',之前的内容为:%s\n", buffer); free(buffer); return 0; } } used += read_cnt; // 缓冲区已满,需要扩容 if (used == capacity) { size_t new_capacity = capacity * 2; // 每次扩容为原来的2倍 char *temp = realloc(buffer, new_capacity * sizeof(char)); if (temp == NULL) { perror("realloc failed"); free(buffer); return -1; } buffer = temp; capacity = new_capacity; } } // 读到文件尾未找到'.' if (read_cnt == 0) { printf("读取到文件结束仍未找到'.'\n"); } else { perror("read failed"); } free(buffer); return -1; }
内容的提问来源于stack exchange,提问作者zelph14
相关产品推荐
相关产品推荐

