一、完成标准io的单字符、字符串、格式化、模块化实现两个文件的拷贝
代码如下:
1.单字符
#include <myhead.h> int main(int argc, const char *argv[]) {//打开文件FILE* fp=fopen("test.txt","r"); FILE* fq=fopen("copy_test.txt","w");if(fp==NULL||fq==NULL){perror("fopen error");return -1;}int ch;//循环将一个文件字符拷贝到另一个文件while(1){ch=fgetc(fp);//若文件指针指向文件末尾跳出循环if(feof(fp))break;fputc(ch,fq);}fclose(fp);fclose(fq);return 0; }
2.字符串:
#include <myhead.h> int main(int argc, const char *argv[]) {FILE* fp=fopen("test.txt","r");FILE* fq=fopen("copy_test.txt","w");if(fp==NULL||fq==NULL){perror("fopen error");return -1;}//定义字符数组存放从初始文件拷贝出来的字符串char str[20];while(1){fgets(str,sizeof(str),fp);if(feof(fp))break;fputs(str,fq);}//向文件写入拷贝成功的话 便于查看结果fprintf(fq,"字符串拷贝成功\n");fclose(fp);fclose(fq);return 0; }
3.格式化:
#include <myhead.h> int main(int argc, const char *argv[]) {FILE* fp=fopen("test.txt","r");FILE* fq=fopen("copy_test.txt","w");if(fp==NULL||fq==NULL){perror("fopen error");return -1;}char ch;while(1){//%c拷贝一切字符包括空格和回车 使文件原样输出fscanf(fp,"%c",&ch);if(feof(fp))break;fprintf(fq,"%c",ch);}fprintf(fq,"格式化拷贝成功\n");fclose(fp);fclose(fq);return 0; }
4.模块化:
#include <myhead.h> int main(int argc, const char *argv[]) {FILE* fp=fopen("test.txt","r");FILE* fq=fopen("copy_test.txt","w");if(fp==NULL||fq==NULL){perror("fopen error");return -1;} //可以使用单个字符单个字符的拷贝 /* char str[50];while(!feof(fp)){int res=fread(str,sizeof(char),sizeof(str)-1,fp);str[res]='\0';fwrite(str,sizeof(char),res,fq);}*///也可以使用每次拷贝字符串数组长度,多次拷贝文件while(1){char str[50]=" ";fread(str,sizeof(str),1,fp);fwrite(str,sizeof(str),1,fq);if(feof(fp))break;}fprintf(fq,"模块化拷贝成功\n");fclose(fp);fclose(fq);return 0; }
运行结果如图所示:
单字符:
字符串:
格式化:
模块化:
二、实现注册和登录功能,将注册账号和密码存储到文件中,登录时遍历文件如果存在就登录成功否则登录失败
代码如下:
#include <myhead.h> //注册函数 int enroll_user(){//以只写形式打开文件FILE *fp=fopen("information.txt","a");//定义两个字符串数组存放账号、密码char username[20],password[20];printf("\t注册页面\n");printf("请输入帐号:");//从终端获取账号scanf("%s",username);//调用判断函数 确定返回值int n=panduan(username);//若账号和已存在的账号不重复if(n!=-1){//写入文件fprintf(fp,"%s",username);fprintf(fp," ");printf("请输入密码:");//从终端获取密码scanf("%s",password);//写入文件fprintf(fp,"%s",password);fprintf(fp,"\n");printf("注册成功\n");fclose(fp);//若重复 退出循环 输出语句}else{printf("用户名重复,请重新输入\n");fclose(fp);} } //判断从终端获取的账号是否和文件中的账号重复 int panduan(char username[20]){FILE *fp=fopen("information.txt","r");//定义字符串数组存放文件中的账号char f_username[20];while(1){fscanf(fp,"%s",f_username);//文件结束且不相等返回0if(feof(fp)){fclose(fp);return 0;}//判断字符串是否相等 相等返回-1if(strcmp(username,f_username)==0){return -1;}}fclose(fp);return 0; } //登录函数 int load_user(){//打开文件FILE *fp=fopen("information.txt","r");//定义字符串数存放从终端获取的账号、密码char username[20],password[20];//存放文件中的账号密码char file_username[20],file_password[20];printf("请输入帐号:");//从终端获取账号scanf("%s",username);//确保文件光标定位在开头fseek(fp,0,SEEK_SET);int n;//while(1){fscanf(fp,"%s",file_username);if(feof(fp)){printf("未查询到该用户,请重新输入\n");break;}//判断账号和文件账号是否相等n=strcmp(username,file_username);//如果不等 获取密码 目的是使光标移动 循环判断是否存在该用户if(n != 0){fscanf(fp,"%s",file_password);//如果相等 获取密码进行匹配判断}else{printf("用户名正确\n");printf("请输入密码:");scanf("%s",password);fscanf(fp,"%s",file_password);if(strcmp(password,file_password)==0){printf("登录成功\n");break;}else{printf("密码错误\n");break;}}} } int main(int argc, const char *argv[]) {/*实现注册和登录功能将注册账号和密码存储到文件中,登录时遍历文件如果存在就登录成功否则登录失败*/ printf("\t欢迎进入网站!\n");int cz=0;//主函数实现结构登录注册页面while(1){printf("\t请选择注册或登录\n");printf("\t1、注册\n");printf("\t2、登录\n");printf("\t0、退出\n");scanf("%d",&cz);//循环调用注册和登录函数switch(cz){case 0:exit(0);case 1://注册函数enroll_user();break;case 2://登录函数load_user();break;}}return 0; }
运行结果如图所示: