|
||||
“绿色”打印程序 |
|
胡东业 江苏省淮阴市运输管理处(223001) 胡东业 江苏省淮阴市运输管理处(223001) 我们要打印很长的文件,诸如程序清单、说明手册等,有时多达上百页。 用现有的打印程序,只能利用打印纸的某一面,另一面通常是浪费掉了,这是 因为程序不能把文件内容连贯地打印在纸张的正反面。也就是说,虽然可以打 印在反面,但正反面的内容却互不相关,毫无联系。因此,这种打印方法很难 充分利用纸的反面。 下述的C语言程序即可解决上述问题。它可以把任意大小的文本文件输出 在打印纸的正反两面,同时有行号、页号及标题等。 使用方法: 1.打印输出 C>GPRN〈页面〉〈起页〉〈止页〉〈文件名〉〉P RN 2.显示输出C>GPRN〈页面〉〈起页〉〈止页〉〈文件名〉 参数说明:1.页面:q或Q:连续输出全部内容,不分反正面; z或Z:只输出正面,即奇数页; f或F:只输出反面,即偶数页; 2.起页:输出的开始页数; 3.止页:输出的结束页数; 4.文件名:要输出的文件名称,个数不限,支持文件名通配符,从命令 行的第4个参数起视为文件名。 1.在输出完某一页面后尚未输出另一页面之前,最好不要在当前目录中 增删文件,以免引起文件输出顺序的变化。例如:C>GPRN z 2 1 0 *.TXT表示输出当前目录中所有后缀名为TXT的文件,且只输出第 2至10页之间的奇数页。这时当前目录中有:A.TXT,S.TXT,K .TXT,打印完正面之后,建立了一个新文件XYZ.TXT.此时文件的 排列顺序是:A.TXT,XYZ.TXT,S.TXT,K.TXT。这样 ,再用C>GPRN f 2 10 *.TXT打印出来的内容与正面的就 不匹配了。如果在命令行不使用文件名通配符,则不必有此顾虑。 2.参数止页可给一个超过实际大小的假设数。 3.本程序用Borland C++ 3.0(称简BC3)编写,B C3本身不能直接处理命令行文件通配符,用如下命令即可使BC3具有直接 处理命令通配符的能力: C>TLIB CS_SETARGV+WILDARGS C>TLIB CC_SETARGV+WILDARGS C>TLIB CM_SETARGV+WILDARGS C>TLIB CL_SETARGV+WILDARGS C>TILB CH_SETARGV+WILDARGS 文件WILDARGS.OBJ在BC3软件包的LIB子目录中,可用 于支持BC3对文件通配符的处理。程序已在COMPAQ 486/33M ,MS-DOS 6.0环境下运行通过。 注意事项: /*“绿色”打印程序〈GPRN.CPP〉*/ ***** #include #include #include const int pgln=56;/*每页输出的行数*/ void main(int argc,char*argv[]) { FILE *fp; char ch,*endptr; int file_no=4,eject=0,p_titl=1,prn_pg_mark=0; unsigned long t_line=1,sta_page, end_page,now_page=1,prn_line=0; if (argc<5) /*至少要有4个参数 */ { printf("\n 用法:C>GPRN <页面> <起页> <止页> <文件名>\7\n"); exit(1); } /* 判断页面参数是否是正确*/ if (strcmp(argv[1],"q")!=0&&strcmp(argv[1],"Q")!=0&& strcmp(argv[1],"z")!=0&&strcmp(argv[1],"Z")!=0&& strcmp(argv[1],"f")!=0&&strcmp(argv[1],"F")!=0) {printf("\n错误!页面参数应为下列之一:q,z,f,Q,Z,F\7\n"); exit(2); } /* 转换并判断起止页是否符合逻辑* / sta_page=strtoul(argv[2],&endptr,10); end_page=strtoul(argv[3],&endptr,10); if (sta_page<1||end_page<1||sta_page>end_page) {printf("错误!起止页参数要符合如下要求:"); printf("起页>0,止页>0,止页>=起页\7\n"); exit(3); } for (file_no=4;file_no if (fp==NULL) printf("\7\7\7");/* 如文件打不开,响铃 */ else { while ((ch=getc(fp))!=EOF) { /* 判断以何种页面输出及是否应该输出 */ if(((strcmp(argv[1],"q")==0||strcmp(argv[1],"Q")==0)|| ((now_page/2*2==now_page)&&(strcmp(argv[1],"f")==0|| strcmp(argv[1],"F")==0))||((now-page/2*2!=now_page)&& (strcmp(argv[1],"z")==0||strcmp(argv[1],"Z")==0)))&& (now_page>=sta_page)&&(now-page<=end-page)) { if(p_titl==1) { printf("\n\n=======No.%d=====Name:%s=======\n", file_no-3,argv[file-no]); printf("%7ld",(now_page21)*pgln+1); p_titl=0; } printf("%c",ch); } if (ch=='\n')/* 判断是否是回车符 */ { t_line++; eject++; if (eject==pgln) /* 判断是否满一页 */ { p_titl=1; eject=0; if (((strcmp(argv[1],"q"==0||strcmp(argv[1],"Q")==0)|| ((now_page/2*2==now_page)&&(strcmp(argv[1],"f")==0|| strcmp(argv[1],"F")==0))||((now-page/2*2!=now_page)&& (strcmp(arg[1],"z")==0||strcmp(argv[1],"Z")==0)))&& (now_page>=sta_page)&&(now_page<=end_page)) { /*\f 位灰撤* */ printf("=======Page%ld=======\f",now_page); prn_pg_mark=1; } now_page++; } if (((strcmp(argv[1],"q")==0||strcmp(argv[1],"Q"==0)|| ((now_page/2*2==now_page)&&(strcmp(argv[1],"f")==0|| strcmp(argv[1],"F")==0))||((now_page/2*2!=now_page)&& (strcmp(argv[1],"z")==0||strcmp(argv[1],"Z")==0)))&& (now_page>=sta_page)&&(now_page<=end_page)&&eject!=0) {printf("%7ld",t_line); prn_line=t_line; prn_pg_mark=0; } }/* ch=='\n'*/ if (now_page>end_page) */ 如当前页大于止页,程序终止执行 */ { fclose(fp); exit(0); } }/* while */ fclose(fp); }/* else */ }/* for */ if ((prn_pg_mark==0)&&(prn_line>=prn_line/pgln*pgln)&&prn_line>0) printf("\n=======Page%ld=======\n",now-page); } /* END MAIN() */ /* END GPRN.CPP 940902(P) */ ***** (计算机世界报 1994年 第46期) |
周报全文频道联系方式:010-68130909 |
||||||
| 【关于我们】 【广告服务】 【周报发行】 【投稿指南】 【投稿声明】 【联系方式】 【法律声明】 【媒体手册】 【编读往来】 |
||||||
| Copyright© ccw.com.cn,All rights reserved | ||||||
| 中国计算机世界出版服务公司版权所有 | ||||||