time/localtime
time_t time(time_t *tloc) ;
功能:返回1970(格林尼治时间)到现在的时间秒数
参数:计算出来的秒数
返回值:成功返回1970年到现在的秒数,失败返回-1并置位错误码
eg:
time_t TM
time(&TM):调用完成TM保存了计算出来的秒数
eg:time_t TM
TM=time(NULL);调用完成返回值TM也保存了计算出来的秒数
struct tm *localtime(const time_t *timep);
功能:时间的秒数作为参数,算出具体的年月日,时分秒。
参数:时间的秒数
返回值:成功返回(struct tm 类型)具体的年月日时分秒,失败返回NULL,并置位错误码。
struct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
#include <myhead.h>
int main(int argc, const char *argv[])
{
time_t TM;
time(&TM);//算出从1970年到现在的时间秒数
struct tm *shijian = localtime(&TM);//返回时间类型的结构体
printf("%d-%d-%d\t%d:%d:%d\n",shijian->tm_year+1900,
shijian->tm_mon+1,shijian->tm_mday,shijian->tm_hour
,shijian->tm_min,shijian->tm_sec);
return 0;
}
12、关于标准文件流指针
stdin:标准输入流指针
stdout:标准输出流指针
stderr:标准错误流指针
结论:标准输入流指针,标准输出流指针缓冲区大小时1024,标准错误流指针没有缓冲区。
#include <myhead.h>
int main(int argc, const char *argv[])
{
char buff[100];
fgets(buff,sizeof(buff),stdin);//获取标准输入流指针的内容
printf("%s",buff);
fputs(buff,stdout);
printf("%ld\n",stdin->_IO_buf_end-stdin->_IO_buf_base);//1024
printf("%ld\n",stdout->_IO_buf_end-stdout->_IO_buf_base);//1024
printf("%ld\n",stderr->_IO_buf_end-stderr->_IO_buf_base);//0
FILE *fp = fopen("./1.txt","r");
if(fp==NULL)
{
perror("fopen");
return -1;
}
fgets(buff,sizeof(buff),fp);
printf("%ld\n",fp->_IO_buf_end-fp->_IO_buf_base);//4096
return 0;
}
缓冲区的刷新时机
行缓冲区(stdin,stdout)大小1024
不缓冲区(stden)大小是0
全缓冲区(FILE *fp)大小是4096
行缓冲区刷新时机
#include <myhead.h>
int main(int argc, const char *argv[])
{
int n;
//1、程序没有结束缓冲区不刷新
printf("班长是好人");
// 2、输出有换行时刷新缓冲区
printf("你好啊大图\n");
//3、输入输出发生切换时刷新缓冲区
printf("我昨天打篮球了");
scanf("%d",&n);
//4、手动调用缓冲区刷新函数强制刷新缓冲区
printf("唐明宇来自于广袤的原始森林");
fflush(stdout);
//5、缓冲区满了也会刷新
int i;
for(i = 0;i<1025;i++)
{
fputc('A',stdout);
}
//6、关闭输入输出流指针
printf("下沙大学城");
fclose(stdout);
while(1);
return 0;
}
不缓冲刷新时机,没有缓冲区,直接输出
#include <myhead.h>
int main(int argc, const char *argv[])
{
fputs("唐明宇",stderr);
while(1);
return 0;
}
fscanf 、fprintf
#include <stdio.h>
int fscanf(FILE *stream, const char *format, ...);
功能:读取文件内容,按照格式转换字符串的形式存入变量中,遇到空格,回车,tab键(制表符),换行自动结束。
参数1:文件指针
参数2:格式转换字符串
参数3,4,5...:需要存储扫描到的结果注意:只能是变量。
返回值:成功返回读取的项数,失败返回0,到达文件末尾返回EOF。
int fprintf(FILE *stream, const char *format, ...);
功能:将变量或者常量的内容按照格式转换字符串的形式写入到文件,遇到\0写入结束.
参数1:文件指针
参数2:格式转换字符串
参数3,4,5...:要存入文件的变量或者常量。
返回值:成功返回读取的项数,失败返回0,到达文件末尾返回EOF。
#include <myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./1.txt","w+");//读写方式打开文件
if(NULL==fp)
{
perror("fopen");
return -1;
}
char s[100] = "杭州是个好地方";
char s1[100] = "1";
int a = 200;
float b = 12.5;
char c = 'W';
fprintf(fp,"%s %d %f %c",s,a,b,c);
fseek(fp,SEEK_SET,0);//光标位于文件的开头
char d;
fscanf(fp,"%s %d %f %c",s1,&a,&b,&d);//读取文件内容
printf("%s\n",s1);
printf("%c",d);
return 0;
}
练习登录注册界面
使用fscanf和fprintf 实现登录注册界面
以追加写的方式将账户密码写入文件可以写入多个账户密码,中间加上空格。
1、建立循环菜单界面
2、功能1调用注册函数,注册账户密码写入到文件中,关闭文件。
3、功能2调用登录函数,手动输入登录账户密码,循环读取文件内容与输入的账户密码匹配,
匹配成功显示登录成功,匹配失败显示登录失败。
#include"fun.h"
int main(int argc, const char *argv[])
{
int ch;
printf("argc = %d\targv[0] = %s\tagrv[1] = %s\n",argc,argv[0],argv[1]);
if(argc!=2)
{
printf("参数错误\n");
return -1;
}
while(1)
{
printf("\t\t\t1、注册\n");
printf("\t\t\t2、登录\n");
printf("\t\t\t0、退出\n");
printf("请输入你的选择:");
scanf("%d",&ch);
getchar();//吸收回车
switch(ch)
{
case 1:
regist(argv[1]);//注册函数
break;
case 2:
login(argv[1]);//登录函数
break;
case 0:
exit(EXIT_SUCCESS);//成功退出
//exit(EXIT_FAILURE);//失败退出
break;
default:
printf("输入有误请重新输入\n");
}
}
return 0;
}
#include"fun.h"
int regist(const char *File)
{
char name[20],code[20];
printf("请输入注册账户:");
fgets(name,sizeof(name),stdin);//输入账户
printf("请输入注册密码:");
fgets(code,sizeof(code),stdin);//输入密码
name[strlen(name)-1] = '\0';
code[strlen(code)-1] = '\0';
FILE *fp = fopen(File,"a");//追加写的方式写入文件
if(fp==NULL)
{
perror("fopen");
return -1;
}
fprintf(fp,"%s %s ",name,code);//将账户密码写入文件
fclose(fp);//关闭文件
return 0;
}
int login(const char *File)
{
char dname[20],dcode[20];//存储输入的账户密码
char name[20],code[20];//存储读取的账户密码
printf("请输入登录账户:");
fgets(dname,sizeof(dname),stdin);//输入账户
printf("请输入登录密码:");
fgets(dcode,sizeof(dcode),stdin);//输入密码
dname[strlen(dname)-1] = '\0';
dcode[strlen(dcode)-1] = '\0';
//循环读取文件内容与账户密码匹配
FILE *fp = fopen(File,"r");//只读方式打开
if(fp==NULL)
{
perror("fopen");
return -1;
}
int flag=0;
while(1)
{
int res = fscanf(fp,"%s %s",name,code);//读取到的账户密码
if(res==EOF)//读取到文件末尾退出
{
break;
}
if(strcmp(dname,name)==0&&strcmp(dcode,code)==0)
{
printf("登录成功!!!\n");
flag=1;
return 0;
}
}
if(flag==0)
{
printf("登录失败,请重新输入\n");
}
fclose(fp);//关闭文件
return 0;
}
#ifndef _FUN_H_
#define _FUN_H_
#include<myhead.h>
int regist(const char *);
int login(const char *);
#endif
fread、fwrite
主要针对二进制文件的读写操作,内存按照扇区存储,每8个扇区是一块
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:从stream指向的文件中读取nmemb项数据,每一项是size字节,存入到ptr指向的空间。
参数1:存储读取内容的指针,可以存储任意类型数据
参数2:读取的每一项大小单位是字节
参数3:读取的项数
参数4:文件指针。
返回值:成功返回读取的项数,读取到文件末尾返回0,该无法识别读取失败还是读取到文件末尾。
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
功能:将ptr指向的数据写入到stream指向的文件中,写入nmemb项,每一项size字节。
参数1:存储写入内容的指针,可以存储任意类型数据
参数2:写入的每一项大小单位是字节
参数3:写入的项数
参数4:文件指针。
返回值:成功返回写入的项数,写入失败返回0。
#include <myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp = fopen("./1.txt","w+");//读写方式打开
if(NULL==fp)
{
perror("fopen");
return -1;
}
char buff[1024] = "123456789";//写入的内容
int res = fwrite(buff,2,4,fp);//写入4项,每项2字节
res = fwrite(buff,sizeof(buff),1,fp);//全部写入
res = fwrite(buff,1,sizeof(buff),fp);//全部写入
printf("res = %d\n",res);//返回值返回写入的项数
fseek(fp,SEEK_SET,0);
char s[1024];
res = fread(s,1,res,fp);//读取1字节读取res项
res = fread(s,1,5,fp);//读取5项每项1字节
res = fread(s,sizeof(s),1,fp);//全部读取
res = fread(s,1,sizeof(buff),fp);//全部读取
printf("res = %d\ns = %s\n",res,s);//返回值返回读取的项数
return 0;
}
练习一:写入读取整数
#include <myhead.h>
int main(int argc, const char *argv[])
{
int n = 100;
FILE *fp = fopen("./1.txt","w");
if(fp==NULL)
{
perror("fopen");
return -1;
}
fwrite(&n,sizeof(int),1,fp);//写入一个整数,写1项每项4字节
fclose(fp);
fp = fopen("./1.txt","r");
if(fp==NULL)
{
perror("fopen");
return -1;
}
int m;
fread(&m,sizeof(int),1,fp);//读取整数
printf("m = %d\n",m);
return 0;
}
练习二:写入结构体
#include <myhead.h>
typedef struct
{
int id;
char name[20];
}user;
int main(int argc, const char *argv[])
{
user us = {1001,"唐明宇"};//用户信息
FILE *fp = fopen("./1.txt","w");
if(fp==NULL)
{
perror("fopen");
return -1;
}
fwrite(&us,sizeof(user),1,fp);//写入用户信息
fclose(fp);
fp = fopen("./1.txt","r");
if(fp==NULL)
{
perror("fopen");
return -1;
}
user ttt;
fread(&ttt,sizeof(user),1,fp);//读取结构体变量
printf("id = %d\t姓名 = %s\n",ttt.id,ttt.name);
return 0;
}
feof、ferror
#include <stdio.h>
int feof(FILE *stream);
功能:检测光标是否到达文件末尾,到达返回非0,未到达返回0
参数:文件指针
int ferror(FILE *stream);
功能:检测光标是否出错,出错返回非0,未出错返回0.
参数:文件指针。
fell
计算光标到开头所占字节数
参数:文件指针
返回值:成功返回光标到文件开头所占字节数,失败返回-1,并置位错误码
rewind
功能:将光标返回到文件开头
参数:文件指针
返回值:无
fseek
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
功能:移动文件内光标函数。
参数1:文件指针
参数2:
SEEK_SET:从头开始移动
SEEK_CUR:从当前位置开始移动
SEEK_END:
从末尾开始移动
参数3:
>0:往后移动字节数
<0:往前移动字节数
=0:不移动.
eg:光标位于文件的开头
fseek(fp,0,SEEK_SET);
光标从头向后移动10字节。
fseek(fp,10,SEEK_SET);
光标从末尾向前移动5字节
fseek(fp,-5,SEEK_END);

#include<myhead.h>
int main(int argc, const char *argv[])
{
FILE *fp1 = fopen("./2.txt","r");
FILE *fp2 = fopen("./3.txt","w");
if(NULL==fp1||NULL==fp2)
{
perror("fopen");
return -1;
}
char buff[102];
size_t b;
while((x=fread(buff,1,sizeof(buff),fp1))>0)
{
size_t a = fwrite(buff,1,x,fp2);
if(b!=a)
{
perror("失败");
fclose(fp1);
fclose(fp2);
return -1;
}
}
fclose(fp1);
fclose(fp2);
// fp2 = fopen("./3.txt","r");
// fread(buff,1,sizeof(buff),fp2);
return 0;
}
2017

被折叠的 条评论
为什么被折叠?



