文件频繁读写优化函数 今天药忘吃喽~ 2022-05-25 09:18 128阅读 0赞 频繁的io读写容易降低程序的效率,避免的此类情况的核心思路是减少io次数,从io中读取足够长度的数据缓存到缓冲区,从缓冲区读取。 #include <stdio.h> #include <string.h> #include <stdlib.h> #define PPS_BUFFER_FILE_NAME_LEN 128 typedef struct file_buffer_t { char file_name[128]; char *buffer; int buffer_size; int buffer_len; int file_start_pos; int file_end; int offset; } FILE_BUF; FILE_BUF *pps_buf_init(char *file_name, int buffer_size) { FILE_BUF *p = NULL; int file_name_len = 0; file_name_len = strlen(file_name); if (file_name == NULL || file_name_len == 0 || buffer_size <= 0) { printf("invalid parameters!\n"); return NULL; } p = calloc(sizeof(FILE_BUF), 1); if (p == NULL) { printf("Apply struct memory failed!\n"); return NULL; } if (file_name_len > PPS_BUFFER_FILE_NAME_LEN) { printf("buffer file name can't exceed %d\n", PPS_BUFFER_FILE_NAME_LEN); free(p); return NULL; } strncpy(p->file_name, file_name, file_name_len); p->buffer_size = buffer_size; p->buffer = calloc(buffer_size, 1); if (p->buffer == NULL) { printf("Apply buffer memory failed!\n"); free(p); return NULL; } return p; } int pps_buf_deinit(FILE_BUF *fbp) { if (fbp == NULL) return -1; if (fbp->buffer != NULL) { free(fbp->buffer); fbp->buffer = NULL; } free(fbp); return 0; } int pps_buf_read(char *buf, int size, int count, FILE_BUF *fbp) { int ret = -1, readlen = 0; if (fbp == NULL || fbp->buffer == NULL) { printf("error FILE_BUF pointer, pelease init first!\n"); return -1; } readlen = size * count; if (readlen > fbp->buffer_size) { printf("read len can't exceed buffer size!\n"); return -1; } if (fbp->file_end && fbp->offset == fbp->buffer_len) return -1; if (fbp->buffer_len == 0 || fbp->offset + readlen > fbp->buffer_size) { FILE *fp = NULL; fp = fopen(fbp->file_name, "r"); if (fp == NULL) { printf("open file [%s] failed", fbp->file_name); return -1; } else { printf("open and read file %s\n", fbp->file_name); } ret = fseek(fp, fbp->file_start_pos + fbp->offset , SEEK_SET); if (ret) { printf("seek file pos filed!\n"); fclose(fp); return -1; } ret = fread(fbp->buffer, 1, fbp->buffer_size, fp); if (ret != fbp->buffer_size) { if (feof(fp)) { fbp->file_start_pos = fbp->file_start_pos + fbp->offset; fbp->offset = 0; fbp->buffer_len = ret; fbp->file_end = 1; } else { printf("read file [%s] filed!\n", fbp->file_name); fclose(fp); return -1; } } else { fbp->file_start_pos = fbp->file_start_pos + fbp->offset; fbp->offset = 0; fbp->buffer_len = ret; } fclose(fp); } if (fbp->offset + readlen > fbp->buffer_len) { readlen = fbp->buffer_len - fbp->offset; } memcpy(buf, fbp->buffer + fbp->offset, readlen); fbp->offset += readlen; return readlen; } int main(int argc, char *argv[]) { int ret = -1; FILE_BUF *fbp = NULL; char str[256]; fbp = pps_buf_init("data.txt", 32*1024); if (fbp == NULL) { printf("error init\n"); return -1; } while (pps_buf_read(str, 1, 128, fbp) != -1) { printf("[ %s ]\n", str); } pps_buf_deinit(fbp); printf("Hello World!\n"); return 0; }
相关 Java多文件读写优化策略案例 在Java中,多文件的读写涉及到IO操作,这往往需要考虑性能优化。以下是一个优化策略案例: 1. **使用BufferedReader和 BufferedWriter**:相 Love The Way You Lie/ 2024年09月11日 00:48/ 0 赞/ 42 阅读
相关 Java读写文件和Scala读写文件 Java实现 package com.xtd.test.java; import java.io.; public class 妖狐艹你老母/ 2023年02月13日 05:49/ 0 赞/ 29 阅读
相关 python读写文件_Python读写文件 ![93f0cb76b7c3483ccd2afe7b37d9ce04.png][] python读写文件 In this tutorial, you’ll learn ho 旧城等待,/ 2022年12月07日 13:28/ 0 赞/ 365 阅读
相关 Java字节流(读文件,写文件,读写文件) 字节流可以读取任何文件,字符流只能读取文本文件。 1、字节流读文件 package com.Java字节流; import java.io.F 客官°小女子只卖身不卖艺/ 2022年11月20日 03:56/ 0 赞/ 279 阅读
相关 java文件读写优化_java文件读写操作 file(内存)----输入流---->【程序】----输出流---->file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,I 迷南。/ 2022年11月05日 05:20/ 0 赞/ 537 阅读
相关 文件读写 文件读写一直都是常用工具,但是也是经常出问题的地方,现总结一二 1. 创建文件 在库函数中有个File.create(filename)用于创建一个文件,但是如果没有对应F 水深无声/ 2022年08月22日 03:56/ 0 赞/ 252 阅读
相关 读写文件 读写文件 FILE fpin = NULL; FILE fpout = NULL; char str1[512] = { 左手的ㄟ右手/ 2022年05月29日 12:17/ 0 赞/ 321 阅读
相关 文件频繁读写优化函数 频繁的io读写容易降低程序的效率,避免的此类情况的核心思路是减少io次数,从io中读取足够长度的数据缓存到缓冲区,从缓冲区读取。 include <stdio.h> 今天药忘吃喽~/ 2022年05月25日 09:18/ 0 赞/ 129 阅读
还没有评论,来说两句吧...