C语言课程设计报告文本信息处理 .doc
XX 航 空 工 业 学 院 课程设计学 号 班 级 姓 名 指导教师 2007年 7 月 19 日沈阳航空工业学院课程设计任务书机械与汽车学院 机械电子工程专业 5406108班 学号200504061269一、课程设计题目:文本信息处理二、课程设计工作自2007年7月9日起至2007年7月16日止三、课程设计内容:用C语言编写软件完成以下任务:(1) 复制文件(将一文本文件中的内容拷贝到另一文本文件中)(2) 显示文件信息内容(并显示行号)(3) 查找字符串(4) 插入字符串(5) 自己再加一项功能四、课程设计要求:程序质量:l 采用模块化程序设计方法,在程序里面,以菜单的形式调用各功能函数,程序可读性强,界面友好,输出形式尽量美观。l 用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。l 用户界面中的菜单至少应包括“复制文件”“显示”“查找”“插入”“退出”五项。l 代码应适当缩进,并给出必要的注释,以增强程序的可读性。课程设计说明书:课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:l 封面l 课程设计任务书l 目录l 需求分析(分析题目的要求)l 程序流程图(总体流程图和主要功能模块流程图)l 核心技术的实现说明及相应程序段l 个人总结l 参考资料l 源程序及适当的注释指导教师:_ 学生签名:_目录一、需求分析2二程序流程图.3三、核心技术的实现方法、程序段及注释8四个人总结.14五、参考文献.14六、源程序14 一、需求分析 经过对程序设计题目的分析可知,整个程序的设计实现大致分为四个模块,其中每一个模块对应一个函数,他们的功能分别是: 复制文件(将一文本文件中的内容拷贝到另一文本文件中) 显示文件信息内容(并显示行号) 查找字符串 插入字符串。在这些函数当中,四个函数的实现严格按照题目的要求。1、复制文件函数 主要实现程序将一个文件复制到另一个文件中 2、显示文件信息内容函数 实现的功能是将文件中的所有 内容通过屏幕显示出来;3、查找字符串函数 按照题目的具体要求找到所要查找的字符串;4、插入字符串函数 还可以插入所组要的字符串;除上面介绍的功能之外,程序还具有退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。 二程序流程图当(1)真输入值n=1?假复制文件Copy()真n=2? 假显示文件信息内容Display()真n=3?假查找字符串Seek()n=4?真 假插入Insert()退出1程序总体结构图:2.具体功能框图: 1 输入被复制的文件名 输入复制的文件名复制的文件不存在真假新建立一个文件 删除,重建 文件指针顺序后移文件没有结束真假 将读取被复制文件中的 字符写入到复制文件中关闭被复制文件 关闭复制文件 调用菜单函数 2 输入显示的文件名真文件不存在?假输出文件不存在显示第一行的行号文件没有结束顺序读取文件中的字符赋给变量t.在屏幕上输出t.t=n?真假输出i,i+ 关闭文件调用菜单函数3输入要查找的文件名文件不存在?真假输出文件不存在输入要查找的字符串统计输入字符串的字符个数,并赋给N将文件指针定位文件开头将N个字符赋给字符串变量到行末?真假i=i+1,将从文件中读取的字符串中的字符顺序与输入的字符串对比真相同?假输出i文件结束?真假指针定位到下一字节继续读取和判断关闭文件调用菜单函数 4 输入要插入的字符的文件名 打开文件 文件不存在? 真假输出文件不存在输入要插入的字符串统计输入的字符串的长度并值赋给M显示插入点选择菜单输入h值h>2|h<1真假重新选择h=1?真假定位文件指针到文件中最后一个字符前h获取指针当前位置赋个q定位文件指针到文件末0=>d写入要插入的字符串读取一个字符赋给c,指针后移一位关闭文件将文件指针后移()位,调用菜单函数在当前写入c,再将指针后移一位将文件指针前移(m+2)位直到dq,将文件指针定位到文件开头写入要插入的字符串关闭文件调用菜单函数三、核心技术的实现方法、程序段及注释本程序主要由四个自定义函数和一个主函数组成,其中主函数以菜单的形式调用其他函数来实现要求的所有功能。下面分别进行说明1、所需要的头文件:#include "stdio.h" /*输入输出函数*/#include "stdlib.h" /*常用函数和符号常量*/#include "string.h" /*字符串函数*/2、声明函数void copy_(); /*声明复制函数*/void display_(); /*声明显示函数*/void seek_(); /*声明查找函数*/void insert_(); /*声明插入 */void menu(); /*声明菜单函数*/3、主函数void main() /*主函数*/ menu(); /*调用菜单函数*/4、菜单函数void menu() /*菜单函数*/ int a; printf("n=Text Information Handling=n"); /*显示菜单*/ printf("+*+n"); printf("+*- 1=<Copy Text> -*+n"); printf("+*- 2=<Display Content of Text> -*+n"); printf("+*- 3=<Seek String> -*+n"); printf("+*- 4=<Insert String> -*+n"); printf("+*- 5=<Exit> -*+n"); printf("+*+n"); printf("=n"); printf("Please input(15),then press <Enter>:"); scanf("%d",&a); switch(a) case 1:copy_();break; case 2:display_();break; case 3:seek_();break; case 4:insert_();break; case 5:exit(0);break; default:printf(" - erro -!n- Back to <Menu> =>>>nn");menu(); /*输入其他数,回到菜单函数*/ 5、复制函数,前提是必须文件要存在,如果不,通过移动指针达到复制的目的,具体的程序段如下:void copy_() /*复制函数*/ FILE *in,*out; char infile20,outfile20; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入被复制的文件名*/ printf("Enter the outfile name=>>"); scanf("%s",outfile); /*输入复制的文件名*/ if(in=fopen(infile,"r")=NULL) /*打开被复制的文件,须已存在*/ printf("cannot open infilen"); exit(0); if(out=fopen(outfile,"w")=NULL) /*打开复制的文件,若存在则删除重建,若不存在则新建*/ printf("cannot open outfilen"); exit(0); while(!feof(in) fputc(fgetc(in),out); /*文件指针顺序后移,若文件未结束,则读取被复制文件中的字符写入复制文件中*/ fclose(in); /*关闭被复制文件*/ fclose(out); /*关闭复制函数*/ menu(); /*调用菜单函数*/6、显示函数,打开存在的文件,在屏幕上输出文件里的所有内容,并显示出行号,具体的程序段如下:void display_() /*显示函数*/ int i=2; /*表示行号的整型变量i,并赋初值2*/ char t; FILE *in; char infile20; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入要显示的文件名*/ if(in=fopen(infile,"r")=NULL) /*打开要显示的文件,须已存在*/ printf("cannot open infilen"); exit(0); printf("1 "); /*显示第一行的行号*/ while(!feof(in) /*判断文件是否结束*/ t=fgetc(in); /*顺序读取文件中的字符赋给变量t*/ printf("%c",t); /*在显示屏上输出t*/ if(t='n') /*判断t是否等于换行符'n'*/printf("%d ",i+); /*若相等则输出整型变量i,并使i的值加1*/ printf("n"); fclose(in); /*关闭文件*/ menu(); /*调用菜单函数*/ 7、查找函数,在要查找的文件中,查找所要查找的字符串,可以同时显示出字符个数,若文件不完全一样,还可以显示出行号,具体的程序段如下:void seek_() /*查找函数*/ FILE *in; int N; int i=1,j; char infile20; char string20; char m20; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入要查找的文件名*/ if(in=fopen(infile,"r")=NULL) /*打开要查找的文件*/ printf("cannot open infilen"); exit(0); printf("Input the string to seek for>>>>="); scanf("%s",string); /*输入要查找的字符串*/ N=(strlen(string); /*统计输入字符串的字符个数,并赋给N*/ rewind(in); /*将文件指针定位到文件开头*/ star1: fread(&m,N,1,in); /*读入N个字符赋给字符串变量m*/ if(m0='n')i+; /*判断是否读到行末,若读到则表示行号的变量i的值加1*/ for(j=0;j<N;j+) /*将从文件中读取的字符串中的字符顺序与输入的字符串中的字符对比*/ if(mj=stringj) continue; else break; if(j=N) printf("in line %dn",i); /*若两个字符串中的前N个字符都相同,则输出读取的字符串所在的行数*/ if(!feof(in) /*判断文件是否结束*/ fseek(in,-(N-1),1); /*若未结束则将文件指针定位到下一字节处*/ goto star1; /*继续进行读取和判断是否相同的工作*/ fclose(in); /*关闭文件*/ menu(); /*调用菜单函数*/ 8、插入函数,将所给定的字符串插入到指定文件中,并输出字符串长度,具体的程序段如下:void insert_() /*插入函数*/ FILE *in; int h,q,M,d; char infile20; char r20,c; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入要插入字符串的文件名*/ if(in=fopen(infile,"rb+")=NULL) /*打开文件*/ printf("cannot open infilen"); exit(0); printf("Input the string you want to insert>>>="); scanf("%s",r); /*输入要插入的字符串*/M=strlen(r); /*统计输入的字符串的长度并将值赋给M*/star2: printf("n+Choose the insert point+n"); /*显示插入点选择菜单*/ printf("-1=<HOME>-2=<END>-n"); printf("+n"); printf("Input the operation number youchoose=>>"); scanf("%d",&h); /*输入h值*/ if(h>2|h<1) printf(" - erro -!n"); printf("- choose again -!nn"); goto star2; /*若h值不为1或2则重新选择*/ if(h=1) /*若h值为1,则执行下面的语句*/ fseek(in,-1L,2); /*定位文件指针到文件中最后一个字符前*/ q=ftell(in); /*获取指针当前位置并赋给q*/ for(d=0;d<=q;d+) /*将以下语句执行(q+1)次*/ c=fgetc(in); /*读取一个字符赋给c,此时指针向后移一位*/ fseek(in,M-1,1); /*将文件指针后移(M-1)位*/ fputc(c,in); /*在当前位置写入c,此时指针向后移一位*/ fseek(in,-(M+2),1); /*将文件指针前移(M+2)位,若是第一次循环,则位于原文件倒数第二个字符前*/ rewind(in); /*将文件指针定位到文件开头*/ fputs(r,in); /*写入要插入的字符串*/ fclose(in); /*关闭文件*/ menu(); /*调用菜单函数*/ if(h=2) /*若h值为2,则执行下面的语句*/ fseek(in,0L,2); /*定位文件指针到文件末*/ fputs(r,in); /*写入要插入的字符串*/ fclose(in); /*关闭文件*/ menu(); /*调用菜单函数*/ 四个人总结通过这次课设,让我对以前所学的C语言知识有了更深刻的理解,还知道了程序的精密性,稍有一点错误,程序就不会运行,所以从中我明白了做事以及做人都要有这种一丝不苟的精神,还有计算机真的是一门学问,很深的学问,想要弄懂它真的要下一份苦功才行啊,最后呢,课程设计还是我们以后走向岗位的基础啊,所以我们一定要重视它啊!五、参考文献1 谭浩强C程序设计北京:清华大学出版社,20052 刘成等C语言程序设计实验指导与习题集北京:中国铁道出版社,2006 六、源程序#include "stdio.h" /*输入输出函数*/#include "stdlib.h" /*常用函数和符号常量*/#include "string.h" /*字符串函数*/void copy_(); /*声明复制函数*/void display_(); /*声明显示函数*/void seek_(); /*声明查找函数*/void insert_(); /*声明插入 */void menu(); /*声明菜单函数*/void main() /*主函数*/ menu(); /*调用菜单函数*/void menu() /*菜单函数*/ int a; printf("n=Text Information Handling=n"); /*显示菜单*/ printf("+*+n"); printf("+*- 1=<Copy Text> -*+n"); printf("+*- 2=<Display Content of Text> -*+n"); printf("+*- 3=<Seek String> -*+n"); printf("+*- 4=<Insert String> -*+n"); printf("+*- 5=<Exit> -*+n"); printf("+*+n"); printf("=n"); printf("Please input(15),then press <Enter>:"); scanf("%d",&a); switch(a) case 1:copy_();break; case 2:display_();break; case 3:seek_();break; case 4:insert_();break; case 5:exit(0);break; default:printf(" - erro -!n- Back to <Menu> =>>>nn");menu(); /*输入其他数,回到菜单函数*/ void copy_() /*复制函数*/ FILE *in,*out; char infile20,outfile20; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入被复制的文件名*/ printf("Enter the outfile name=>>"); scanf("%s",outfile); /*输入复制的文件名*/ if(in=fopen(infile,"r")=NULL) /*打开被复制的文件,须已存在*/ printf("cannot open infilen"); exit(0); if(out=fopen(outfile,"w")=NULL) /*打开复制的文件,若存在则删除重建,若不存在则新建*/ printf("cannot open outfilen"); exit(0); while(!feof(in) fputc(fgetc(in),out); /*文件指针顺序后移,若文件未结束,则读取被复制文件中的字符写入复制文件中*/ fclose(in); /*关闭被复制文件*/ fclose(out); /*关闭复制函数*/ menu(); /*调用菜单函数*/void display_() /*显示函数*/ int i=2; /*表示行号的整型变量i,并赋初值2*/ char t; FILE *in; char infile20; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入要显示的文件名*/ if(in=fopen(infile,"r")=NULL) /*打开要显示的文件,须已存在*/ printf("cannot open infilen"); exit(0); printf("1 "); /*显示第一行的行号*/ while(!feof(in) /*判断文件是否结束*/ t=fgetc(in); /*顺序读取文件中的字符赋给变量t*/ printf("%c",t); /*在显示屏上输出t*/ if(t='n') /*判断t是否等于换行符'n'*/printf("%d ",i+); /*若相等则输出整型变量i,并使i的值加1*/ printf("n"); fclose(in); /*关闭文件*/ menu(); /*调用菜单函数*/ void seek_() /*查找函数*/ FILE *in; int N; int i=1,j; char infile20; char string20; char m20; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入要查找的文件名*/ if(in=fopen(infile,"r")=NULL) /*打开要查找的文件*/ printf("cannot open infilen"); exit(0); printf("Input the string to seek for>>>>="); scanf("%s",string); /*输入要查找的字符串*/ N=(strlen(string); /*统计输入字符串的字符个数,并赋给N*/ rewind(in); /*将文件指针定位到文件开头*/ star1: fread(&m,N,1,in); /*读入N个字符赋给字符串变量m*/ if(m0='n')i+; /*判断是否读到行末,若读到则表示行号的变量i的值加1*/ for(j=0;j<N;j+) /*将从文件中读取的字符串中的字符顺序与输入的字符串中的字符对比*/ if(mj=stringj) continue; else break; if(j=N) printf("in line %dn",i); /*若两个字符串中的前N个字符都相同,则输出读取的字符串所在的行数*/ if(!feof(in) /*判断文件是否结束*/ fseek(in,-(N-1),1); /*若未结束则将文件指针定位到下一字节处*/ goto star1; /*继续进行读取和判断是否相同的工作*/ fclose(in); /*关闭文件*/ menu(); /*调用菜单函数*/ void insert_() /*插入函数*/ FILE *in; int h,q,M,d; char infile20; char r20,c; printf("Enter the infile name=>>"); scanf("%s",infile); /*输入要插入字符串的文件名*/ if(in=fopen(infile,"rb+")=NULL) /*打开文件*/ printf("cannot open infilen"); exit(0); printf("Input the string you want to insert>>>="); scanf("%s",r); /*输入要插入的字符串*/M=strlen(r); /*统计输入的字符串的长度并将值赋给M*/star2: printf("n+Choose the insert point+n"); /*显示插入点选择菜单*/ printf("-1=<HOME>-2=<END>-n"); printf("+n"); printf("Input the operation number youchoose=>>"); scanf("%d",&h); /*输入h值*/ if(h>2|h<1) printf(" - erro -!n"); printf("- choose again -!nn"); goto star2; /*若h值不为1或2则重新选择*/ if(h=1) /*若h值为1,则执行下面的语句*/ fseek(in,-1L,2); /*定位文件指针到文件中最后一个字符前*/ q=ftell(in); /*获取指针当前位置并赋给q*/ for(d=0;d<=q;d+) /*将以下语句执行(q+1)次*/ c=fgetc(in); /*读取一个字符赋给c,此时指针向后移一位*/ fseek(in,M-1,1); /*将文件指针后移(M-1)位*/ fputc(c,in); /*在当前位置写入c,此时指针向后移一位*/ fseek(in,-(M+2),1); /*将文件指针前移