标准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);//1024printf("%ld\n",stdout->_IO_buf_end - stdout->_IO_buf_base);//1024getchar();//stdinprintf("%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);//4096fclose(fp);//验证不缓存大小perror("result");printf("%ld\n",stderr->_IO_buf_end - stderr->_IO_buf_base);//0return 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:登录功能,提示并输入登录账户和登录密码,并用其遍历文件中的每一组账户和密码,如果匹配成功,则登录成功,如果全部不匹配,则提示登录失败。