首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

文本文件逆序输出解决办法

2012-03-20 
文本文件逆序输出测试文件大小64MB,每次读写数据的大小为4KB。要实现对此文本文件的逆序,并且逆转结果必须

文本文件逆序输出
测试文件大小64MB,每次读写数据的大小为4KB。要实现对此文本文件的逆序,并且逆转结果必须是原文件名。

比若说e盘下有个a.txt.逆序处理后,该文件的内容逆序,不是生成新的文件。

这是操作系统的课程设计,希望各位大神帮我找到一个确实可行的思路方法,当然如果拥有源代码就更好了

[解决办法]
这个需求正好可以使用内存映射 可以参考《windows核心编程》
[解决办法]

C/C++ code
#include <stdio.h>FILE *fi,*fo;void main() {    fo=fopen("e:\\_a.txt","wb");    fi=fopen("e:\\a.txt","rb");    fseek(fi,-1L,SEEK_END);    while (1) {        fputc(fgetc(fi),fo);        if (fseek(fi,-2,SEEK_CUR)) break;    }    fclose(fi);    fclose(fo);    remove("e:\\a.txt");    rename("e:\\_a.txt","e:\\a.txt");}
[解决办法]
注意:操作系统读写文件的最小单位本来就是4KB(通常每个簇4KB)
[解决办法]
每次分别从开头和末尾读4KB到缓冲区,然后交换数据,最后分别写到文件的末尾和开头的4KB数据里;
依此递归处理,即可
[解决办法]
如果不使用新文件的话,需要4KB内存做缓存
读取文件开始的4KB到内存BUF
读取文件末尾的4KB,逆序从末尾往前读,正序存到文件开头。或者正序读逆序写也是一样的。
再把内存BUF里的内容,逆序读,正序写到文件末尾的4KB

至此首位4KB内容处理完毕,接下来处理第二个4KB和倒数第二个4KB,类推直至所有内容处理完毕。
[解决办法]
头读4K,尾读4K,倒序后,头向尾覆盖写入,尾向头写
依次向回操作
[解决办法]
高效的办法肯定是内存映射了,但有个疑问就是楼主想按字节逆序还是按行逆序。

按字节逆序那么就是从末尾开始,每次映射一段内存,反向访问内存写到另一个文件里即可,比如文件大小是4,先映射[2,3],写[3,2]到新文件,然后映射[1,2],写[2,1]到新文件。

按行逆序方法基本类似, 也是从末尾开始,每次映射一段, 在那一段里strrchr找\n,找到一个就是一行,把这一行写到新文件里. 如果在剩余内存里找不到\n,那么从当前偏移量重新向前映射min{left_bytes,LEN_PER_MAPED},继续从新内存的起始端开始向前找\n。
[解决办法]
文件逆序直接用_strrev/_wcsrev

热点排行