博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从I/O到文件格式
阅读量:7221 次
发布时间:2019-06-29

本文共 1148 字,大约阅读时间需要 3 分钟。

谈效率

unbuffered I/O(read write)

#include <unistd.h>

ssize_t read(int filedes, void *buf, size_t nbytes);
ssize_t write(int filedes, void *buf, size_t nbytes);
这里buf的大小严重影响效率,如果buf为1的话,比起最优大小可以差近50倍。当buf为4096个字节时效率最高(不一样的系统结果也不一样)。
这里的read和write都是直接调用内核的系统调用。(内核怎么做的先不理会了)

标准 I/O

#include <stdio.h>

// 标准io只写了读写字符的二进制的没写,主要是说效率差别。
// 一次读写一个字符的函数
int getc(FILE *fp);
int fgetc(FILE *fp);
int getchar(void);
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
// 一次读写一行字符的函数
char *fgets(char *restrict buf, int n, FILE *restrict fp);
char *fputs(const char *restrict str, FILE *restrict fp);
这里读写一个字符和一行字符的标准I/O效率差别不是很大,和直接试用write和read的最佳时间接近。
试用标准I/O其实无需考虑缓冲区的大小,知道缓冲区积累了合适的字符时才会进行系统调用真正的读写。

我的错误

就在几天前刚刚解决了的问题,今天突然又不知道啥原因了,我很郁闷。

是这样的,我打开一个文件写完后又读取,总是读不出来。之后我在写完后,关闭文件又打开再写,这样是成功的。
查了查中知道了,以前没这样随机读取过文件,没有这种意识:写完文件后,文件的偏移量,是在文件末尾的,只
有重新设置文件偏移量才可以。 fseek(fp, 0 , SEEK_SET);

自定制格式文件

如果文件很大的话,你很难去把文件的内容全部读入内存,通过这种偏移,你可以把文件分割成好多块,把各个块的偏移记录在文件开头固定长度内。

如果寻找某块的内容,把开头的固定一段读入内存,找到要读取目标的偏移和长度,就可以很容意单独的取出文件内容的一部分。 
灵活的东西,往往一开始都是写死的东西,比如,计算机启动时从硬盘固定的地址读取数据。所以不要指望他出生就很灵活。

转载于:https://www.cnblogs.com/wendao/archive/2012/08/22/2646124.html

你可能感兴趣的文章
问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
查看>>
Kibana配置logstash,报表一体化
查看>>
算法-图和图算法
查看>>
Babel配置的不完全指南
查看>>
【附node操作实例】redis简明入门系列—字符串类型
查看>>
设计模式走一遍---观察者模式
查看>>
Docker 笔记(2):Dockerfile
查看>>
聊聊sentinel的DegradeSlot
查看>>
不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
查看>>
E-HPC支持多队列管理和自动伸缩
查看>>
Java编程基础24——递归练习
查看>>
基于web的全景—— Pannellum小试
查看>>
因为阿里,他们成了“杭漂”
查看>>
jQuery(一)
查看>>
前端存储 - localStorage
查看>>
express + mock 让前后台并行开发
查看>>
30天自制操作系统-2
查看>>
[LeetCode/LintCode] Largest Palindrome Product
查看>>
小程序开发之路(一)
查看>>
携程小程序初体验
查看>>