文本文件逆序输出
测试文件大小64MB,每次读写数据的大小为4KB。要实现对此文本文件的逆序,并且逆转结果必须是原文件名。
比若说e盘下有个a.txt.逆序处理后,该文件的内容逆序,不是生成新的文件。
这是操作系统的课程设计,希望各位大神帮我找到一个确实可行的思路方法,当然如果拥有源代码就更好了
[解决办法]
这个需求正好可以使用内存映射 可以参考《windows核心编程》
[解决办法]
#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