标准IO:
1.打开文件
#include<myhead.h>
int main(int argc, const char *argv[])
{
//定义文件指针
FILE *fp=NULL;
//以只读的形式打开文件
//fp=fopen("./text.txt","r");
//以只写的形式打开文件
fp=fopen("./time.c","w");
if(fp==NULL)
{
perror("fopen error");
return -1;
}
printf("文件打开成功\n");
//关闭文件
fclose(fp);
return 0;
}
2.单字符读写
#include<myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp=NULL;
//以只写的形式打开文件
fp=fopen("./test.txt","w");
if(fp==NULL)
{
perror("fopen error");
return -1;
}
//向文件中写入数据
fputc('W',fp);
fputc('e',fp);
fputc('l',fp);
fputc('c',fp);
fputc('o',fp);
fputc('m',fp);
fputc('e',fp);
//关闭文件
fclose(fp);
//以只读的形式再次打开文件
fp=fopen("./test.txt","r");
if(fp==NULL)
{
perror("fopen error");
return -1;
}
while(1)
{
char ch=fgetc(fp);//从fp指向的文件中读取一个字符
if(ch==EOF)//读取到文件结束了
{
break;
}
printf("%c ",ch);
}
printf("\n");
//关闭文件
fclose(fp);
return 0;
}
3.使用fgetc统计给定文件行数。
#include<myhead.h>
int main(int argc, const char *argv[])
{
//判断外部传参是否合法
if(argc!=2)
{
printf("input file error\n");
printf("usage:./a.out filename\n");
}
//定义文件指针
FILE *fp=NULL;
//以只读的形式打开文件
fp=fopen(argv[1],"r");
if(fp==NULL)
{
perror("fopen error");
return -1;
}
//统计行号
int line=0;
char ch=0;//遍历文件的字符
while(1)
{
//循环从文件中读取一个字符,知道读取结束为止
char ch=fgetc(fp);
if(ch==EOF)
{
break;
}
//判断获取的字符是否为‘\n’
if(ch=='\n')
{
line++;
}
}
printf("一共有%d行\n",line);
//关闭文件
fclose(fp);
return 0;
}
4.使用fgetc和fput完成两个文件拷贝。
#include<myhead.h>
int main(int argc, const char *argv[])
{
//判断外部传参是否合法
if(argc!=3)
{
printf("input file error\n");
printf("usage:./a.out srcfile destfile\n");
}
//定义文件指针
FILE *srcfp=NULL;
FILE *destfp=NULL;
//以只读的形式打开源文件
srcfp=fopen(argv[1],"r");
if(srcfp==NULL)
{
perror("fopen srcfile error");
return -1;
}
//以只写的形式打开目标文件
destfp=fopen(argv[2],"w");
if(destfp==NULL)
{
perror("fopen destfile error");
return -1;
}
char ch=0;//遍历文件的字符
while(1)
{
//循环从文件中读取一个字符,知道读取结束为止
char ch=fgetc(srcfp);
if(ch==EOF)
{
break;
}
//将读取的数据放入到目标文件中
fputc(ch,destfp);
}
//关闭文件
fclose(srcfp);
fclose(destfp);
return 0;
}
5.字符串读写
#include<myhead.h>
int main(int argc, const char *argv[])
{
//定义文件指针,以只写的形式打开文件
FILE *fp=NULL;
if((fp=fopen("./02test.txt","w"))==NULL)
{
perror("fopen error");
return -1;
}
//向文件中写入字符串
fputs("hello\n",fp);
fputs("world\n",fp);
//关闭文件
fclose(fp);
//以只读的形式再次打开文件
if((fp=fopen("./02test.txt","r"))==NULL)
{
perror("fopen error");
return -1;
}
char buf[5];//字符串的搬运工
while(1)
{
char *p=fgets(buf,sizeof(buf),fp);//从fp中读取字符串到buf中
if(p==NULL)
{
break;
}
printf("buf=%s\n",buf);
}
//关闭文件
fclose(fp);
return 0;
}
6.格式化读写
#include<myhead.h>
int main(int argc, const char *argv[])
{
//以只写的形式打开文件
FILE *fp=NULL;
if((fp=fopen("./03test.txt","w"))==NULL)
{
perror("fopen error");
return -1;
}
//定义要写入的数据
int numb=1000;
char name[]="zhangzhiren";
int age=30;
fprintf(fp,"%d %s %d\n",numb,name,age);
//关闭文件
fclose(fp);
//使用fscanf从终端读取数据
int value;
fscanf(stdin,"%d",&value);
printf("value=%d\n",value);
return 0;
}
7.新读写函数取代旧读写函数
#include<myhead.h>
int main(int argc, const char *argv[])
{
//单字符读写操作
char ch=0;
ch=fgetc(stdin);//ch=getchar();
fputc(ch,stdout);//putchar(ch);
fgetc(stdin);//getchar();
printf("\n************\n");
//字符串读写操作
char str[128]="";
fgets(str,sizeof(str),stdin);//gets(str);
fputs(str,stdout);//puts(str);
printf("\n************\n");
//格式化读写操作
int num=0;
fscanf(stdin,"%d",&num);//scanf("%d",&num);
fprintf(stdout,"num=%d\n",num);//printf("num=%d\n",num);
return 0;
}
8.验证缓冲区大小
#include<myhead.h>
int main(int argc, const char *argv[])
{
printf("%ld\n",stdout->_IO_buf_end - stdout->_IO_buf_base);//1024
printf("%ld\n",stdout->_IO_buf_end - stdout->_IO_buf_base);//1024
getchar();//stdin
printf("%ld\n",stdin->_IO_buf_end - stdin->_IO_buf_base);//1024
//验证全缓存大小
FILE *fp=NULL;
if((fp=fopen("./04test.txt","w"))==NULL)
{
perror("fopen error");
return -1;
}
fprintf(fp,"hello");
printf("%ld\n",fp->_IO_buf_end - fp->_IO_buf_base);//4096
fclose(fp);
//验证不缓存大小
perror("result");
printf("%ld\n",stderr->_IO_buf_end - stderr->_IO_buf_base);//0
return 0;
}
9.行缓存的刷新时机
#include<myhead.h>
int main(int argc, const char *argv[])
{
/*
//1.缓冲区刷新时机未到,不会展示在终端上
printf("hello world");
while(1);//阻塞
*/
/*
//2.遇到‘\n’会刷新行缓存
printf("hello world\n");
while(1);//阻塞
*/
/*
//3.文件结束后,会刷新行缓存
printf("hello world");
*/
/*
//4.当关闭文件指针后,会刷新行缓存
printf("hello world");
fclose(stdout);//关闭文件指针
while(1);
*/
/*
//5.使用fflush刷新缓冲区后,会刷新行缓存
printf("hello world");
fflush(stdout);
while(1);
*/
/*
//6.当输入输出发生切换时,会刷新行缓存
int num;
printf("请输入num的值:");
scanf("%d",&num);
*/
//7.当缓冲区满了后,会刷新缓冲区
for(int i=0;i<1025;i++)
{
printf("A");
}
while(1);
return 0;
}
10.全缓存的刷新时机
#include<myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp=NULL;
if((fp=fopen("./06test.txt","w+"))==NULL)
{
perror("fopen error");
return -1;
}
/*
//1.缓冲区刷新时机未到,不会展示在终端上
fprintf(fp,"hello world");
while(1);//阻塞
*/
//2.遇到‘\n’不会刷新全缓存
fprintf(fp,"hello world\n");
while(1);//阻塞
/*
//3.文件结束后,会刷新全缓存
fprintf(fp,"hello world");
*/
/*
//4.当关闭文件指针后,会刷新全缓存
fprintf(fp,"hello world");
fclose(fp);//关闭文件指针
while(1);
*/
/*
//5.使用fflush刷新缓冲区后,会刷新全缓存
fprintf(fp,"hello world");
fflush(fp);
while(1);
*/
/*
//6.当输入输出发生切换时,会刷新全缓存
int num;
fprintf(fp,"请输入num的值:");
fgetc(fp);
*/
/*
//7.当缓冲区满了后,会刷新缓冲区
for(int i=0;i<4097;i++)
{
fprintf(fp,"A");
}
while(1);
*/
return 0;
}
11.不缓存的刷新时机:只要有数据,直接被刷新
#include<myhead.h>
int main(int argc, const char *argv[])
{
fprintf(stderr,"A");//向标准出错中写入数据
while(1);
return 0;
}
12.获取系统当前时间
#include<myhead.h>
int main(int argc, const char *argv[])
{
//1.获取时间的秒数
time_t sysTime=time(NULL);
//2.通过秒数获取时间结构体指针
struct tm *t=localtime(&sysTime);
//3.将时间打印在终端上
//printf("%4d-%2d-%2d %2d:%2d:%2d\n",t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
//将时间的格式串存储到一个数组中
char time_buf[128]="";
snprintf(time_buf,sizeof(time_buf),"%4d-%2d-%2d %2d:%2d:%2d\n",t->tm_year+1900,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
printf("time_buf=%s\n",time_buf);
return 0;
}
13.使用fgets统计给定文件行数
#include<myhead.h>
int main(int argc, const char *argv[])
{
//判断外部传参
if(argc!=2)
{
printf("input file error\n");
printf("usage:./a.out filename\n");
return -1;
}
//定义文件指针,以只读形式打开文件
FILE *fp=NULL;
if((fp=fopen(argv[1],"r"))==NULL)
{
perror("fopen error");
return -1;
}
//统计行数
int line=0;
char buf[5]="";
while(1)
{
char *p=fgets(buf,sizeof(buf),fp);
if(p==NULL)
break;
//判断最后一个字符为'\n'
if(buf[strlen(buf)-1]=='\n')
line++;
}
//输出行数
printf("一共%d行\n",line);
//关闭文件
fclose(fp);
return 0;
}
14.使用fputs和fgets完成两个文件拷贝
15.完成注册登录功能,做个小菜单
功能1:注册功能,输入注册账号和登录密码,将账号和密码写入文件中。
功能2:登录功能,提示并输入登录账户和登录密码,并用其遍历文件中的每一组账户和密码,如果匹配成功,则登录成功,如果全部不匹配,则提示登录失败。