一、完成标准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); //文件结束且不相等返回0 if(feof(fp)) { fclose(fp); return 0; } //判断字符串是否相等 相等返回-1 if(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; }
运行结果如图所示: