day26 IO

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值