- 论坛徽章:
- 0
|
最近开始学习C++ 工作中需要修改一个别人写的东西
大概是这样
有种文件 一行就是一条完整信息 有多个字段 其中一个是时间 另一个是类型 每个文件大概2000行吧。
例如有文件 20090110100000.txt
文件的排列是无序 例如第一行是 A 类型 时间是 2009-01-10 10:00:00 下一行 就是 B 类型 2009-01-10 09:45:00 再下可能就是B 2009-01-10 10:05:00 了 接着还可能是C 时间又跑前边去了。
就是说 一共有3个类型 A B C 时间则分布在该文件名称的前后各15分钟区间内 无序但是符合范围 现在要 5分钟一个段 拆分出来 3种类型 每种6个段。
就是说 我要把文件拆到 3*6 个文件中去
例如 A200901100945.TXT,A200901100950.TXT A200901100955.TXT A200901101000.TXT A200901101005.TXT A200901101010.TXT
b c 同样
原先的写法的 每处理一个文件 打开后 就open 3*6 个目标文件
读一行后 判断出来该是什么类型 去哪个文件 就用 fprintf 方法写 这样倒是省事了 但是io很大
我想把读出来的每行 先放到一个缓存了 然后到一定数量再写一回IO,但是可能就要建立 6*3 个缓存 例如 char[1024] 这样的 来存放每种数据
每个还要缓存对应相应的 文件名 以到最后判断写到哪个文件中 我都开始考虑是否要用个map之类的容器把 文件名 和 缓存 建立个映射
回头每读完一行 判断出哪个文件后 就去map找缓存 写入。
但是总觉得这个方法很不好。
后来看到了fwrite 觉得是否 直接吧原来的 fprintf 方法替换掉 直接使用 fwrite 把里边的buffer设置大些 也有类似的效果?
我这里面临的最大问题就是 每读一行 该写入的缓存都是不定的 每次都要重新判断去找18个中的哪个
fwrite 是否是缓存存到一定的大小才会写硬盘呢?
例如 我读第一个行 要写到 a 10点00 的那个文件去 使用fwrite写 但是现在buffer不满 那么fwrite就先不写io
下一行 是 c 10点15 那就写到另外一个缓存去。
假如第3行 又变成 a 10点00 的了 此时fwrite的buffer满了 于是此时才连同第一次的一起IO 写入文件
fwrite 能达到这个效果吗?如果不能 回到我原来的想法 该使用个什么容器吗 搞个映射吗?
求高人指点 谢谢~
[ 本帖最后由 oov 于 2009-1-17 00:14 编辑 ] |
|