c语言之文件操作练习

来源:互联网 发布:加盟农村淘宝怎么申请 编辑:程序博客网 时间:2024/06/05 09:40

之前操作系统作业有个题目涉及到文件操作,在osjob分类下面,做得比较简单,并没有完全按照老师的要求来做。

程序里面需要设定传入参数,我是直接在vc工程里面设置的,project->settings->Debug选项卡下面有个program arguments,在这个输入框里面输入参数,多个参数以空格分开

/************************************************************************//* 01.c*//* 读取磁盘文件内容                                                     *//************************************************************************/#include <stdio.h>int main(int argc,char *argv[]){FILE *fp;//定义文件指针fpchar ch,*fileName;fileName = argv[1];fp = fopen(fileName,"r");//只读方式if(fp == NULL){printf("open file error\n");return -1;}ch = fgetc(fp);while (ch != EOF){putchar(ch);//将读入的字符输出到屏幕上ch = fgetc(fp);}printf("\n");fclose(fp);//关闭文件return 0;}/************************************************************************//* 02.c*//* 将数据写入磁盘文件                                                   *//************************************************************************/#include <stdio.h>int main(int argc,char *argv[]){FILE *fp;char ch,*fileName;fileName = argv[1];fp = fopen(fileName,"w");if(fp == NULL){printf("open file error\n");return -1;}ch = getchar();//读取屏幕输入字符while (ch != '#'){fputc(ch,fp);//将读入的字符写到磁盘文件上去ch = getchar();}fclose(fp);return 0;}/************************************************************************//* 03.c*//* 格式化读写文件*//************************************************************************///fprintf和fscanf函数的读写对象不是终端而是磁盘文件#include <stdio.h>int main(int argc,char *argv[]){int i;char str[50],*fileName;fileName = argv[1];FILE *fp;if((fp = fopen(fileName,"w")) == NULL){printf("open file error\n");return -1;}printf("Input the string:");scanf("%s",str);fprintf(fp,"%s",str);//将str字符串内容以%s形式写到fp所指文件上fclose(fp);fp = fopen(fileName,"r");//重新以只读方式打开磁盘文件while (fscanf(fp,"%s",str) != EOF)//从fp所指的文件中以%s形式读入字符串{for (i =0; str[i] != '\0'; i++){if(str[i] >= 'a' && str[i] <= 'z')//将小写转换成大写str[i] = str[i] - 32;}printf("%s\n",str);}fclose(fp);return 0;}/************************************************************************//* 04.c*//* 成块读写操作*//* 键盘输入学生成绩信息,保存到指定文件,再输出到屏幕上*//* fwrite(buff,size,count,fp);buff是一个指针,是要输出数据的地址        *//*size要读写的字节数;count要进行读写多少个size字节的数据项*//************************************************************************/#include <stdio.h>#define STUNUM 5struct stuScore{char name[10];//姓名int num;//学号int math;//数学成绩int china;//语文}stu[STUNUM];//保存到磁盘int save(char *fileName,int n){FILE *fp;int i;if((fp=fopen(fileName,"w")) == NULL){printf("open file error\n");return -1;}for (i=0; i<n; i++){//将一组数据输出到fp所指的文件中if(fwrite(&stu[i],sizeof(struct stuScore),1,fp) != 1){printf("write error\n");}}fclose(fp);return 0;}//从磁盘读取int show(char *fileName,int n){FILE *fp;int i;if((fp=fopen(fileName,"r")) == NULL){printf("open file error\n");return -1;}for (i=0; i<n; i++){//从fp所指的文件中读取数据存放到stu中fread(&stu[i],sizeof(struct stuScore),1,fp);printf("%-10s%4d%4d%4d\n",stu[i].name,stu[i].num,stu[i].math,stu[i].china);}fclose(fp);return 0;}int main(int argc,char *argv[]){char *fileName;int i;fileName = argv[1];printf("Input the stuname stunum mathscore chinascore\n");for(i=0 ;i<STUNUM ;i++){printf("NO%d.",i+1);scanf("%s%d%d%d",stu[i].name,&stu[i].num,&stu[i].math,&stu[i].china);save(fileName,STUNUM);}show(fileName,STUNUM);return 0;}/************************************************************************//* 05.c*//* 文件合并*//************************************************************************/#include <stdio.h>int main(int argc,char *argv[]){//将file2内容合并到file1char *fileName1,*fileName2;char ch;fileName1 = argv[1];fileName2 = argv[2];FILE *fp1;FILE *fp2;if((fp1=fopen(fileName1,"a+")) == NULL){printf("file1 open error\n");return -1;}printf("file1:\n");ch = fgetc(fp1);while (ch != EOF ){putchar(ch);ch = fgetc(fp1);}printf("\n");if((fp2=fopen(fileName2,"r")) == NULL){printf("file2 open error\n");return -1;}printf("file2:\n");ch = fgetc(fp2);while (ch != EOF ){putchar(ch);ch = fgetc(fp2);}printf("\n");fseek(fp2,0,0);//将文件2指针从文件最后移到文件2首部while ((ch = fgetc(fp2)) != EOF){fputc(ch,fp1);//将文件2中的内容写到文件1末尾}//fp1 = fopen(fileName1,"r");//ch = fgetc(fp1);//while (ch != EOF)//{//putchar(ch);//ch = fgetc(fp1);//}printf("\nMerge Success\n");fclose(fp2);fclose(fp1);return 0;}/************************************************************************//* 06.c*//* 文件内容加密                                                         *//************************************************************************/#include <stdio.h>//加密int code(char *sourcefile,char *pwd,char *codefile,char *decodefile){FILE *fp1;FILE *fp2;FILE *fp3;char ch;int i=0;if((fp1=fopen(sourcefile,"rb"))==NULL){printf("open sourcefile error\n");return -1;}if((fp2=fopen(codefile,"wb"))==NULL){printf("open codefile error\n");return -1;}if((fp3=fopen(decodefile,"wb"))==NULL){printf("open decodefile error\n");return -1;}ch = fgetc(fp1);while ( !feof(fp1)){ch = ch ^ *(pwd+i);//与密钥异或方式加密fputc(ch,fp2);ch = ch ^ *(pwd+i);//解密----再异或一次fputc(ch,fp3);ch = fgetc(fp1);i++;if(i > 10)i = 0;}fputc('\0',fp2);return 0;}int main(int argc,char *argv[]){int re;char *sourcefile,*pwd,*codefile,*decodefile;sourcefile = argv[1];//源文件pwd = argv[2];//密钥codefile = argv[3];//编码后生成文件decodefile = argv[4];//解码后生成文件printf("coding begin...\n");if(re =code(sourcefile,pwd,codefile,decodefile) != -1)printf("coding...\n");elseprintf("coding error\n");printf("coding success\n");return 0;}/************************************************************************//* 07.c*//* 删除文件中的记录                                                     *//************************************************************************/#include <stdio.h>#include <string.h>#define STUSIZE 5struct student{char name[10];int score;}stu[STUSIZE];//将读入的学生数据写到磁盘文件上int write(struct student stu[],char * filename,int n){FILE *fp1;int i;if((fp1=fopen(filename,"wb") )== NULL)//以追加的方式打开指定文件{printf("open file error\n");return -1;}for (i=0 ;i<n; i++){//将学生信息输出到磁盘文件上if(fwrite(&stu[i],sizeof(struct student),1,fp1) != 1)printf("write error\n");}fclose(fp1);return 0;}//显示文件内容int show(struct student stu[],char *filename,int &n){FILE *fp2;int i;if ((fp2=fopen(filename,"rb")) == NULL){printf("open file error\n");return -1;}for (i=0; i<n; i++)//读取磁盘文件上的信息到stu数组中if(fread(&stu[i],sizeof(struct student),1,fp2) !=0)printf("\n %8s%7d\n",stu[i].name,stu[i].score);n = i;fclose(fp2);return 0;}//删除操作int deleteData(struct student stu[],char *filename,int n){char name[10];int i,j,flag=1;printf("\n Input name which do you want to delete:");scanf("%s",name);for (i=0; flag && i<n; i++){if(strcmp(name,stu[i].name) == 0)//查找与输入姓名相匹配的位置{for(j=i; j<n-1; j++){//查找到要删除的位置后将后面的信息前移覆盖删除位置strcpy(stu[j].name,stu[j+1].name);stu[j].score = stu[j+1].score;}flag = 0;}}if (!flag){n = n-1;}elseprintf("\nNot find the same name infomation\n");write(stu,filename,n);return 0;}int main(int argc,char *argv[]){char *filename;int i,n=STUSIZE;filename = argv[1];for (i=0; i<STUSIZE; i++){printf("NO%d.",i+1);scanf("%s%d",stu[i].name,&stu[i].score);}write(stu,filename,STUSIZE);printf("orignal data:\n");show(stu,filename,n);deleteData(stu,filename,STUSIZE);printf("changed data:\n");show(stu,filename,n);//删除一条数据后,人数-1return 0;}