编写自己的TXT2EXE

Author: 北京 林朝阳 Date: 1996-03-22

        其实这一类软件不过是把数据文件和可执行文件合并在一起成为一个大的可执行文件,在执行过程中,打开此文件自身,定位文件指针后从中读取数据,并按一定规则进行处理,即可达到XXX2EXE的效果。下面给出一个最简单的TXT2EXE的源程序,并加以详细的注释。假设用它作用一个文本文件后最后给出的可执行文件为TEST.EXE。
        /*最简单的TXT2EXE.EXE的源程序TXT2EXE.CPP
        /*编译器是TURBO C++ 2.0
        #include <stdlib.h>
        #include <stdio.h>
        #include <conio.h>
        /*定义ESC键码,程序中用于退出*/
        #define ESC 0x1b
        void main(int argc,char *argv[])
        {
        FILE *fp;
        int line=0;
        char string[100];
        if(argc>1)
        {
        printf("\n\n      Parameter is not needed !\n\n");
        printf("\n\n      Any key to continue !\n\n");
        getch();
        }
        if((fp=fopen(argv[0],"r"))==NULL)
        {
        /*打开文件出错处理*/
        printf("\n\n      File Open Error !\n\n");
        printf("\n\n      Any key to exit .\n\n");
        getch();
        exit(0);
        }
        /*定位文件指针,其中15727L需要自己调整,详见后面说明*/
        fseek(fp,15727L,SEEK-SET);
        clrscr();   /*清屏幕
        while(!feof(fp))
        {
        /*从文件中读取数据,因为屏幕为80列,因此一次最多读取80个字符*/
        fgets(string,80,fp);
        /*设置显示文件颜色和屏幕底色,此处设为亮白色和黑色*/
        textcolor(WHITE);
        textbackground(BLACK);
        cprintf("\r%s",string);
        line++;
        /*设每屏幕为22行正文,满屏后处理*/
        if(line==22)
        {
        line=0;   /*行数计数器清0*/
        /*隔一个空行后用红色显示提示行*/
        textcolor(LIGHTRED);
        cprintf("\r\n   Any key to next page,ESC to exit");
        /*显示一屏后停止,等待下一个命令:任意键看下一屏,ESC退出*/
        switch(getch())
        {
        /*若退出则关闭文件,恢复正常屏幕属性,并清屏*/
        case ESC:fclose(fp);textcolor(7);clrscr();exit(0);
        /*正常情况下清屏,准备显示下一屏*/
        default:clrscr();
        }
        }
        }
        fclose(fp);
        /*完毕后恢复正常屏幕属性,并清屏*/
        textcolor(7);
        /*最后一屏不会被立即清掉*/
        getch();
        clrscr();
        return;
        }
        编译连接此文件,形成TXT2EXE.EXE,在DOS下查看TXT2EXE.EXE的长度,不妨假设为15839字节,回头再将TXT2EXE.CPP中的fseek(fp,15727L,SEEK-SET);语句中的常数改为15839L,重新编译,此时可执行文件长度一般不会变化了,可能就是15839字节。
        找一个TXT文件,不妨假设为TEST.TXT,最好每行字符数不要超过80个(从程序中可以看出,fgets函数每次读80个字符,若是某行超过80个字符,会将一个单词分开!)。然后自己编写一个简单的批文件MYBAT.BAT,内容为
        @REM MYBAT.BAT的内容
        @ECHO OFF
        COPY/B TXT2EXE.EXE+TEST.TXT TEST.EXE
        REM 立即测试
        TEST
        运行MYBAT.BAT,即可大功告成!以后要再做其他TXT文件的EXE,可以同法处理。只要将批处理中的TXT文件名字和最后可执行文件的名字改变一下就可以了,TXT2EXE.EXE是通用的。
        本TXT2EXE.EXE和汉字TEXT文件结合后,在汉字系统如UCDOS 3.1、SPDOS 5.1支持下也可以显示汉字文件。
        上述TXT2EXE.EXE是原理性的,最简单的,若要发展,可以加入Page Up功能用来翻上一页,Home功能用来翻到文件第一页,End功能用来翻页到文件尾。若在文本文件中自己加入某些自定义的控制符,在TXT2EXE中再分别处理,还可以达到特别突出某行的目的(如改用其他颜色),还可以考虑加入鼠标驱动和滚动条。