#include <stdio.h>#include <stdlib.h>#include <string.h> #include <io.h>//定义BSIZE为32*1M #define BSIZE (32*1024*1024)char buf[BSIZE];int convertchar(char *buf, int bufsize);int resumechar(char *buf, int bufsize);int write_file(const char *fout, const char *buf, int bufsize);int read_file(const char *fin, char *buf, int bufsize, int flag);int p_buf(const char *buf, int n);char *input_fname(char * in_fn, int fn_size);void p_help(void);int main(int argc, char *argv[]){ char buf_sw[256], in_fn[256]; int read_n = 0; p_help(); while(printf("\ninput cmd>"),gets(buf_sw)) { switch(buf_sw[0]) { case 'c': printf("please input file(be converted) path...\n"); read_n = read_file(input_fname(in_fn, 256), buf, BSIZE, 0); if(read_n < 0) { printf("read fail!\n"); break; } printf("begin convert file...\n"); //简单的 转换,加密文档 if(convertchar(buf, read_n)) { printf("convert fail!\n"); break; } printf("convert file ok!\n"); printf("save the converted file,input a file name path:\n"); write_file(input_fname(in_fn, 256), buf, read_n); printf("save file ok! the file is:%s\n", in_fn); break; case 'r': printf("please input file(be resumed) path...\n"); read_n = read_file(input_fname(in_fn, 256), buf, BSIZE, 0); if(read_n < 0) { printf("read fail!\n"); break; } printf("begin resume file...\n"); //恢复文档 if(resumechar(buf, read_n)) { printf("resume fail!\n"); return 1; } printf("resume ok, now save the resumed file,input a path:\n"); write_file(input_fname(in_fn, 256), buf, read_n); printf("save file ok! the file is:%s\n", in_fn); break; case 'p': printf("show specified file context,input filename path:\n"); read_file(input_fname(in_fn, 256), buf, BSIZE, 1); break; case 'h': case 'H': p_help(); break; case 'q': case 'Q': exit(1); default: printf("input cmd again!\n"); } } sleep(10); system("PAUSE"); return 0;}void p_help(void){ printf("cmd \"c\" for convert file to special format\n"); printf("cmd \"r\" for resume file to normal format\n"); printf("cmd \"p\" show context of a file\n"); printf("cmd \"q\" or \"Q\" for quit program cmd \"h\" or \"H\" for help"); return ;}/* *如果不使用 in_fn = malloc(fn_size);这句,那就得用数组,不然不用malloc会出错 ×如果用malloc那么返回这个值之前不能释放这段内存,因为它还要使用这个内存的值 ×但是如果这样的话,下次我怎么知道什么时候释放,经过试验,是不能在其他函数中释放的。 ×最后还是采用数组吧,数组也不行,因为它是局部变量了,函数不能返回一个局部变量的指针 */char *input_fname(char *in_fn, int fn_size){//文件名定义为fn_size,此处为256个字节 // if(!(in_fn = malloc(fn_size)))// {// printf("malloc for file name path fail!\n");// return NULL;// } printf("input a file path:\n"); gets(in_fn); printf("file path is: %s \n", in_fn);// free(in_fn); //如果前面是malloc这一行不能用,否则,接下来返回的指针式NULL就会判断文件不存在 return in_fn;}/*input: buf, n *output: buf *return: int: 1,0; *function: print char; *加密方式:偏移ASCII码值,将来还要加入一些复杂度更高的加密方法 */int p_buf(const char *buf, int n){ int i = 0; for(i = 0; i < n; i++) { printf("%c", buf[i]); } printf("\n");}/*input: buf, bufsize *output: buf *function: convert char; *加密方式:偏移ASCII码值,将来还要加入一些复杂度高度加密方法 */int convertchar(char *buf, int bufsize){ int i = 0; //这里对buf也应该判断,显然buf不能是NULL if(bufsize<=0||buf==NULL) { return 1; } for(i = 0; i < bufsize; i++) { //ascii[48,126]-15 -->[33,111] if((buf[i]>=48)&&(buf[i]<=126)) { buf[i] = buf[i]- 15; } else if((buf[i]<=47)&&(buf[i]>=33)) { //ascii[33,47]+79 -->[112,126] buf[i] = buf[i]+79; } else if((buf[i]>=0&&buf[i]<=31)||(buf[i] == 32)) { } else { buf[i] = buf[i] - 1; } } return 0;}/*input: buf, bufsize *output: buf *function: resume char; *解密方式:反偏移ASCII码值 */int resumechar(char *buf, int bufsize){ int i = 0; if((bufsize<=0)||(buf==NULL)) { return 1; } for(i = 0; i < bufsize; i++) { //[33,111]+15; -->ascii[48,126] if((buf[i]>=33)&&(buf[i]<=111)) { buf[i] = buf[i] + 15; } else if((buf[i]<=126)&&(buf[i]>=112)) { //[112,126]-79;-->ascii[33,47] buf[i] = buf[i] - 79; } else if((buf[i]>=0&&buf[i]<=31)||(buf[i] == 32)) { } else { buf[i] = buf[i] + 1; } } return 0;}int write_file(const char *fout, const char *buf, int w_size){ FILE *fop = NULL; if((w_size <= 0)||(fout == NULL)||(buf == NULL)) { return 1; } if((fop = fopen(fout, "w"))==NULL) { return 1; } fwrite((void *)buf, 1, w_size, fop); fclose(fop); return 0; }/*input: fin, bufsize *output: buf *return: rn(read size),-1(failed) *function: read file to buf; */int read_file(const char *fin, char *buf, int bufsize, int flag){ FILE *fop = NULL; int rn = 0; printf("[debug] fin %x, %s, flag:%d \n-----\n", fin, fin, flag); if((bufsize < -1)||(fin == NULL)||(buf == NULL)) { printf("input args invalid!\n"); return -1; } if(access(fin, 0)) { printf("file not exist!\n"); return -1; } if((fop = fopen(fin, "r"))==NULL) { printf("file open failed!\n"); return -1; } //之前malloc了,现在free;但是这样free是不行的,都不在一个生命周期了 //free(fin); rn = fread((void *)buf, 1, bufsize, fop); fclose(fop); //如果flag==1,那么打印从文件中读到的内容; if(flag == 1) { p_buf(buf, rn); } return rn;}