自学内容网 自学内容网

10.16标准IO

1、完成标准IO的单字符、字符串、格式化、模块化实现两个文件的拷贝;

单字符实现

#include <myhead.h>
int main(int argc, const char *argv[])
{
//使用单字符完成两个文件拷贝
FILE *fp_src=fopen(argv[1],"r");
FILE *fp_dest=fopen(argv[2],"w");
if(fp_src==NULL||fp_dest==NULL){
perror("fopen error");
return -1;
}
char ch;
while(1){
ch=fgetc(fp_src);
if(feof(fp_src)){
break;
}
fputc(ch,fp_dest);
}
fclose(fp_src);
fclose(fp_dest);
return 0;
}

字符串实现 

#include <myhead.h>
int main(int argc, const char *argv[])
{
//使用字符串完成两个文件拷贝
FILE *fp_src=fopen(argv[1],"r");
FILE *fp_dest=fopen(argv[2],"w");
if(fp_src==NULL||fp_dest==NULL){
perror("fopen error");
return -1;
}
char temp[10]="";
while(1){
/*char *res=fgets(temp,sizeof(temp),fp_src);
if(NULL==res){
break;
}*/
fgets(temp,sizeof(temp),fp_src);
if(feof(fp_src)){//文件结束判断
break;
}
fputs(temp,fp_dest);
}
fclose(fp_src);
fclose(fp_dest);

return 0;
}

格式化实现

#include <myhead.h>
#define MAX 3
typedef struct Student{//定义一个学生信息的结构体
char name[20];
int id;
double chinese;
double math;
double english;
double physical;
double chemical;
double biological;
}stu_t,*Pstu_t;
void input_stu(Pstu_t p){//在终端向p指向的空间输入学生信息
int i;
for(i=0;i<MAX;i++){//终端输入学生信息
printf("请输入第%d个学生信息:",i+1);
scanf("%s%d%lf%lf%lf%lf%lf%lf",(p+i)->name,&(p+i)->id,&(p+i)->chinese,
&(p+i)->math,&(p+i)->english,&(p+i)->physical,&(p+i)->chemical,&(p+i)->biological);
}
}
void save_stu(const char *file,Pstu_t p){//将p指向的学生信息内容保存到文件中
FILE *fp=fopen(file,"w");
if(NULL==fp){
perror("文件打开失败");
return;
}
int i;
for(i=0;i<MAX;i++){
fprintf(fp,"%s %d %.2lf %.2lf %.2lf %.2lf %.2lf %.2lf\n",(p+i)->name,(p+i)->id,(p+i)->chinese,
(p+i)->math,(p+i)->english,(p+i)->physical,(p+i)->chemical,(p+i)->biological);
}
fclose(fp);
}
void load_stu(const char *file,Pstu_t p){//将文件中学生信息读取到p指向的空间中,并终端打印学生信息
FILE *fp=fopen(file,"r");
if(NULL==fp){
perror("文件打开失败");
return;
}
int i=0;
while(1){//将文件中学生信息读取到p指向的空间中
int res=fscanf(fp,"%s%d%lf%lf%lf%lf%lf%lf",(p+i)->name,&(p+i)->id,&(p+i)->chinese,
&(p+i)->math,&(p+i)->english,&(p+i)->physical,&(p+i)->chemical,&(p+i)->biological);
//对于%s%d%lf遇到与自己类型不匹配的情况时,读取结束,并且光标保持在与自己类型不匹配的字符上(包括空格和换行),但对于空格和换行是结束标志,同时,空格和换行结束后再读取可以跳过空格和换行继续读取与之匹配的内容,其他字符不可以实现
//%c是所有字符都吸收,包括空格和换行
if(EOF==res){
break;
}
i++;
}
fclose(fp);
for(i=0;i<MAX;i++){//终端打印学生信息
printf("第%d个学生信息:\n姓名:%s\n学号:%d\n语文:%.2lf\n数学:%.2lf\n英语:%.2lf\n物理:%.2lf\n化学:%.2lf\n生物:%.2lf\n",i+1,
(p+i)->name,(p+i)->id,(p+i)->chinese,(p+i)->math,(p+i)->english,(p+i)->physical,
(p+i)->chemical,(p+i)->biological);
}

}
int main(int argc, const char *argv[])
{
//使用动态内存开辟空间实现
Pstu_t p=(Pstu_t)malloc(sizeof(stu_t)*MAX);
if(NULL==p){
perror("空间开辟失败");
return 1;
}
input_stu(p);
save_stu(argv[1],p);
Pstu_t ps=(Pstu_t)malloc(sizeof(stu_t)*MAX);
if(NULL==ps){
perror("空间开辟失败");
return 1;
}
load_stu(argv[1],ps);
free(p);
p=NULL;
free(ps);
ps=NULL;
return 0;
}

模块化实现

#include <myhead.h>
#define MAX 3
typedef struct node{
char name[20];
int age;
float score;
}stu;
int main(int argc, const char *argv[])
{
stu arr[MAX];
int i=0;
for(i=0;i<MAX;i++){
printf("第%d个学生姓名:",i+1);
scanf("%s",arr[i].name);
printf("第%d个学生年龄:",i+1);
scanf("%d",&arr[i].age);
printf("第%d个学生成绩:",i+1);
scanf("%f",&arr[i].score);
}
FILE *fp_w=fopen(argv[1],"w");
if(fp_w==NULL){
perror("file open error");
}
fwrite(arr,sizeof(stu),MAX,fp_w);//往文件中写入数据
fclose(fp_w);
FILE *fp_src=fopen(argv[1],"r");
if(fp_src==NULL){
perror("open scrfile error");
}
FILE *fp_dest=fopen(argv[2],"w");
if(fp_dest==NULL){
perror("open destfile error");
}
stu temp;
while(1){
size_t res=fread(&temp,sizeof(stu),1,fp_src);
if(res==0){
break;
}
fwrite(&temp,sizeof(stu),res,fp_dest);
printf("姓名:%s,年龄:%d,成绩:%.2f\n",temp.name,temp.age,temp.score);
}
fclose(fp_src);
fclose(fp_dest);
return 0;
}

 2、实现注册和登录功能,将注册账号和密码存储到文件中,登录时遍历文件如果存在就登录成功否则登录失败

#include <myhead.h>
typedef struct data{
char load_name[20];
char passwd[20];
}usr;
int main(int argc, const char *argv[])
{
int input;
while(1){
printf("请输入功能:1.注册,2.登录,3.退出\n");
scanf("%d",&input);
FILE *fp=fopen(argv[1],"a+");
usr temp;
usr temp_cmp;
usr buf;
int flag=0;
int res;
switch(input){
case 1:
//注册账号
printf("请输入用户名:\n");
scanf("%s",temp.load_name);
printf("请输入密码:\n");
scanf("%s",temp.passwd);
res=fwrite(&temp,sizeof(temp),1,fp);
if(res==1){
printf("注册成功\n");
}
break;
case 2:
//登录账号
printf("请输入用户名:\n");
scanf("%s",buf.load_name);
printf("请输入密码:\n");
scanf("%s",buf.passwd);
while(1){
fread(&temp_cmp,sizeof(usr),1,fp);
if(feof(fp)){
break;
}
if((strcmp(buf.load_name,temp_cmp.load_name)==0)&&\
(strcmp(buf.passwd,temp_cmp.passwd)==0)){
printf("登录成功\n");
flag=1;
break;
}
}
if(0==flag){
printf("登录失败\n");
}
break;
case 3:
exit(0);
break;
}
fclose(fp);
}
return 0;
}

代码结果:

 


原文地址:https://blog.csdn.net/qq_40378766/article/details/142991352

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!