读书人

集思广益算法思想讨论!该如何解决

发布时间: 2012-02-28 13:06:34 作者: rapoo

集思广益,算法思想讨论!
有一个很大的文件(大的可以到几十M):
有序地存储着如:
Y Of Row1 (BytesPerLine)
M of Row1 (BytesPerLine)
C of Row1 (BytesPerLine)
K of Row1 (BytesPerLine)

Y Of Row2 (BytesPerLine)
M of Row2 (BytesPerLine)
C of Row2 (BytesPerLine)
K of Row2 (BytesPerLine)
......
Y Of RowN (BytesPerLine)
M of RowN (BytesPerLine)
C of RowN (BytesPerLine)
K of RowN (BytesPerLine)
其中Y ,M,C,K分别表示同类数据,(Y,M,C,K)的行数相同。

现在要对文件的存储数据进行调整:
所有M类数据要向下移动H行,前面的H行填0;C类数据向下移动2H行,前面2H行填0;K类数据向下移动3H行,前面的3H行填0。
如下:

Y Of Row1 (BytesPerLine)
000000000 (BytesPerLine)
000000000 (BytesPerLine)
000000000 (BytesPerLine)
........
Y Of Rowi (BytesPerLine)
M of Rowi-H (BytesPerLine)
C of Rowi-2H (BytesPerLine)
K of Rowi-3H (BytesPerLine)

.....
000000000 (BytesPerLine)
000000000 (BytesPerLine)
000000000 (BytesPerLine)
K of RowN (BytesPerLine)

将调整后的结果保存到新的文件中。

提示:文件数据量很大,希望打开并遍历读取文件数据的次数尽可能少(节约时间)。

仁者见仁,智者见智。有好的想好大家讨论讨论。
谢谢!

[解决办法]

C/C++ code
所有M类数据要向下移动H行,前面的H行填0;C类数据向下移动2H行,前面2H行填0;K类数据向下移动3H行,前面的3H行填0。------------------读出源文件中的内容写到新的文件中去,碰完Y类数据,下面填充H行0,继续读取,碰到M类数据,下面填充2H行0,以此类推,就是边写变处理,不过新的文件貌似得足够的大,
[解决办法]

一行一行读取旧文件,每读取一行,就往新文件写一行,

往新文件些之前先判断此行之前应该添加的 00000行数目

并向新文件写如这些 0000行,如此下去


对于几10m的文件应该没问题
[解决办法]
才几十M的文件,根本就是毛毛雨,哪称得上大。
一次全读入内存后,想咋搞咋搞,然后一次全写回去。
[解决办法]
用队列来实现,YMCK各一个队列,应该很容易,但不知道效率如何
[解决办法]
一次性读到内存,不行吗?或者是内存使用有限制?
[解决办法]
貌似几十M的文件可以直接载入内存。
再大了不妨考虑内存映射文件,每次view一块,处理完毕,view下一块。

读书人网 >C++

热点推荐