6.21 作业

1.向文件中输出时间,并且是每一秒更新一次,按ctrl+c停止输出后,下次再运行./a.out会继续想文件中接着输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
int main(int argc,const char *argv[])
{
	FILE *f;
	//打开文件
	if((f=fopen("./time.txt","a+"))==NULL)
	{
		perror("fopen error");
		return -1;
	}
	
	//计算行数
	char a[128];
	int line=0;
	while(fgets(a,sizeof(a),f)!=NULL)
	{
		if(a[strlen(a)-1]=='\n')
			line++;
	}

	//写入时间
	time_t t;
	struct tm *date;
	int sec = -1;
	while(1)
	{
		time(&t);
		date = localtime(&t);
		if(sec!=date->tm_sec)//判断时间增加
		{
			fprintf(f,"%d:%4d-%02d-%02d %02d:%02d:%02d\n",++line,
					date->tm_year+1900,date->tm_mon+1,date->tm_mday,
					date->tm_hour,date->tm_min,date->tm_sec);
			sec = date->tm_sec;
			fflush(f);	//刷新缓冲区
		}
	}
	fclose(f);
	return 0;
}

 2.使用fread、fwrite完成两个文件的拷贝

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,const char *argv[])
{
	FILE *fp1 = NULL,*fp2 = NULL;//fp1为源文件 fp2为目标文件
	//从终端输入文件,打开文件
	if((fp1 = fopen(argv[1],"r")) == NULL)
	{
		perror("f1 error");
		return -1;
	}
	if((fp2 = fopen(argv[2],"w")) == NULL)
	{
		perror("f2 error");
		return -1;
	}
	//复制文件
	char a[20];
	int teg;
	while((teg=fread(a,1,sizeof(a),fp1))!=0)
	{
		fwrite(a,1,teg,fp2);
	}
	fclose(fp1);
	fclose(fp2);
	return 0;
}

3.1 fopen和fclose的使用

#include<stdio.h>

int main(int argc, const char *argv[])
{
    FILE *fp = NULL;//定义文件指针

    //使用fopen打开一个文件
    fp = fopen("./01text.txt", "w"); 

    //判断是否打开成功
    if(fp == NULL)
    {
        printf("open file error\n");
    }else
    {
        printf("open file ok\n");
    }
    //关闭一个文件
    if(fclose(fp)!=0)
    {
        printf("文件关闭失败\n");
    }
    return 0;
}

 3.2错误码

#include<stdio.h>
//#include<errno.h>      //错误码所在的头文件
//#include<string.h>

int main(int argc, const char *argv[])
{
    FILE *fp;             //定义一个文件指针

    //以只读的形式打开文件
    if((fp = fopen("./02test.txt", "r")) == NULL)
    {
        //strerror(errno);    //将错误码转变成错误信息
        //printf("%s\n", strerror(errno));
        perror("fopen error");

        return -1;
    }
    fclose(fp);
    
    return 0;
}

3.3 fgetc和fputc的使用

#include<stdio.h>

int main(int argc, const char *argv[])
{
    //定义文件指针
    FILE *srcfp, *dstfp;
    //以只读的形式打开文件
    if((srcfp=fopen(argv[1], "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //以只写的形式打开第二个文件
    if((dstfp = fopen(argv[2], "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //定义容器存放读取的字符
    char ch;
    //循环从文件中读取数据
    while((ch = fgetc(srcfp)) != EOF)
    {
        //将读取出来的数据放入第二个文件中
        fputc(ch, dstfp);
    }

    //关闭文件
    fclose(srcfp);
    fclose(dstfp);

    printf("拷贝成功\n");

    return 0;
}

3.4 fgets和fputs的使用

#include<stdio.h>

int main(int argc, const char *argv[])
{
    //定义文件指针
    FILE *srcfp, *dstfp;
    //以只读的形式打开文件
    if((srcfp=fopen(argv[1], "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //以只写的形式打开第二个文件
    if((dstfp = fopen(argv[2], "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //定义容器存放读取的字符
    char chi[20];
    //循环从文件中读取数据
    while(fgets(chi,srcfp) != NULL)
    {
        //将读取出来的数据放入第二个文件中
        fputs(chi,dstfp);
    }

    //关闭文件
    fclose(srcfp);
    fclose(dstfp);

    printf("拷贝成功\n");

    return 0;
}

3.5缓冲区大小

#include<stdio.h>

int main(int argc, const char *argv[])
{
    //验证行缓存大小为1024字节
    //如果没有使用缓存区,那么其大小为0
    printf("行缓存的大小为:%ld\n", stdin->_IO_buf_end - stdin->_IO_buf_base);

    //使用标准输入指针
    char s[128];
    fgets(s, sizeof(s), stdin);
    printf("s = %s\n", s);
    //当使用了该缓存区后,该大小为1024
    printf("行缓存的大小为:%ld\n", stdin->_IO_buf_end - stdin->_IO_buf_base);
    printf("行缓存的大小为:%ld\n", stdout->_IO_buf_end - stdout->_IO_buf_base);

    //验证全缓存的大小
    FILE *fp;
    //打开文件
    if((fp=fopen("./01test.txt", "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    //向文件中写入数据
    fputc('H', fp);

    printf("全缓存的大小为:%ld\n", fp->_IO_buf_end-fp->_IO_buf_base);

    //关闭文件
    fclose(fp);

    //验证不缓存的大小
    fputs("error\n", stderr);           //向标准出错中写入数据
    printf("不缓存的大小为:%ld\n", stderr->_IO_buf_end-stderr->_IO_buf_base);

    return 0;
}

3.6行缓存刷新时机

#include<stdio.h>

int main(int argc, const char *argv[])
{
    //当缓存区没有到刷新时机时,不会刷新缓存区
    //printf("hello world");
    //while(1);
    
    //1、遇到换行符号时会刷新缓存区
    //printf("hello world\n");
    //while(1);
    
    //2、程序结束后,会自动刷新缓存区
    //printf("hello world");
    

    //3、当关闭文件指针时,会刷新缓存区
    //printf("hello world");
    //fclose(stdout);           //手动关闭标准输出文件指针
    //while(1);
    
    //4、当使用fflush函数刷新时,也会刷新缓存区
    //printf("hello world");
    //fflush(stdout);            //手动刷新缓存区
    //while(1);
    
    //5、缓存区满了,也会刷新缓存区
    //for(int i=0; i<1500; i++)
    //{
    //    printf("A");
    //}
    //while(1);
    
    //6、当输入输出发生切换时也会刷新缓存区
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    while(1);

    return 0;
}

3.7 全缓存刷新时机

#include<stdio.h>

int main(int argc, const char *argv[])
{
    FILE *fp;
    //打开文件
    if((fp=fopen("./01test.txt", "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //1、当遇到换行符号时,不会刷新全缓存
    //fputs("hello world\n", fp);
    //while(1);

    //2、当程序结束后,会刷新全缓存
    //fputs("hello world", fp);

    //3、当关闭文件指针时,会刷新全缓存
    //fputs("hello world", fp);
    //fclose(fp);
    //while(1);
    
    //4、当使用fflush刷新时,会刷新全缓存
    //fputs("hello world", fp);
    //fflush(fp);
    //while(1);
    
    //5、当全缓存满了后,会刷新全缓存
    //for(int i=0; i<5000; i++)
    //{
    //    fputc('A', fp);
    //}
    //while(1);
    
    //6、当输入输出切换时,会刷新全缓存
    fputc('H', fp);
    fgetc(fp);
    while(1);

    return 0;
}

3.8 输出时间

#include<stdio.h>
#include<time.h>           //有关时间的头文件

int main(int argc, const char *argv[])
{
    //定义时间类型,保存秒数
    time_t sys_time;

    //调用time函数,获取秒数
    time(&sys_time);

    //调用将秒数转变成时间指针
    struct tm * t = localtime(&sys_time);

    //输出获取的时间
    printf("%4d-%02d-%02d %02d:%02d:%02d\n",\
            t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
            t->tm_hour, t->tm_min, t->tm_sec);
    
    return 0;
}

3.9 springtf和snprintf

#include<stdio.h>
#include<time.h>           //有关时间的头文件

int main(int argc, const char *argv[])
{
    //定义时间类型,保存秒数
    time_t sys_time;

    //调用time函数,获取秒数
    time(&sys_time);

    //调用将秒数转变成时间指针
    struct tm * t = localtime(&sys_time);

    //输出获取的时间
//    printf("%4d-%02d-%02d %02d:%02d:%02d\n",\
            t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
            t->tm_hour, t->tm_min, t->tm_sec);

    char buf[128] = "";           //定义一个数组
    /*
    sprintf(buf,"%4d-%02d-%02d %02d:%02d:%02d\n",\
            t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
            t->tm_hour, t->tm_min, t->tm_sec);
    */
    snprintf(buf,sizeof(buf),"%4d-%02d-%02d %02d:%02d:%02d\n",\
            t->tm_year+1900, t->tm_mon+1, t->tm_mday,\
            t->tm_hour, t->tm_min, t->tm_sec);

    printf("%s", buf);      //输出时间

    return 0;
}

3.10 fscanf和fprintf

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
    //定义文件指针
    FILE *fp;
    char userName[100];
    char pwd[20];

    //以只写的形式打开文件
    if((fp=fopen("./06test.txt", "a")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //将账号和密码输入
    printf("请输入注册账号:");
    scanf("%s", userName);
    printf("请输入密码:");
    scanf("%s", pwd);

    //将内容写入文件中
    fprintf(fp, "%s %s\n", userName, pwd);
    

    //关闭文件
    fclose(fp);
    printf("注册成功\n");

    //再次以只读的形式打开文件
    if((fp = fopen("./06test.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //定义变量接收登录账号和密码
    char login[100], password[20];
    printf("请输入登录账号:");
    scanf("%s", login);
    printf("请输入登录密码:");
    scanf("%s", password);

    while(fscanf(fp,"%s %s", userName, pwd) != EOF)
    {
        if(strcmp(userName,login)==0 && strcmp(pwd,password)==0)
        {
            printf("登录成功\n");

            fclose(fp);
            return 2;
        }
    }
    
    printf("登录失败\n");
    fclose(fp);

    return 0;
}

3.11 feof、ferror的使用

#include<stdio.h>

int main(int argc, const char *argv[])
{
    FILE *fp;

    //以只读的形式打开文件
    if((fp=fopen("./01size.c", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    while(1)
    {
        char ch;
        ch = fgetc(fp);
        printf("%c", ch);

        if(feof(fp))
        {
            printf("读到文件末尾\n");
            break;
        }else if(ferror(fp))
        {
            printf("读取文件失败\n");
            break;
        }
    }

    //关闭文件
    fclose(fp);

    return 0;
}

3.12 关于光标的函数(fseek、ftell、rewind)

#include<stdio.h>

//定义结构体类型
struct Stu
{
    char name[20];
    int age;
    double score;
};

int main(int argc, const char *argv[])
{
    //定义文件指针
    FILE *fp;

    //以只写的形式打开文件
    if((fp=fopen("./07test.txt", "w")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //定义两个结构体变量
    struct Stu s[2] = {{"zhangsan", 18, 99}, {"lisi", 20, 88}};

    //向文件中写入两个学生大小的数据
    fwrite(s, sizeof(struct Stu), 2, fp);

    //关闭文件
    fclose(fp);

    //以只读的形式打开文件
    if((fp = fopen("./07test.txt", "r")) == NULL)
    {
        perror("fopen error");
        return -1;
    }
    
    //以fread进行读取数据
    struct Stu stu;

    //要读取第二个学生信息
    //定位光标
    fseek(fp, sizeof(struct Stu) ,SEEK_SET);
    int ret = fread(&stu, sizeof(struct Stu), 1, fp);

    printf("姓名:%s, 年龄:%d, 分数:%lf\n", stu.name, stu.age, stu.score);

    //fwrite(buf1, 1, ret, stdout);

    //关闭文件
    fclose(fp);

    return 0;
}

3.13 以追加的形式打开文件,使用fseek函数移动光标,是否能够起效果

#include<stdio.h>

int main(int argc, const char *argv[])
{
    FILE *fp;
    //以追加的形式打开文件
    if((fp=fopen("./01test.txt", "a+")) == NULL)
    {
        perror("fopen error");
        return -1;
    }

    //更新指针执行到开头
    fseek(fp, 0, SEEK_SET);

    fputs("hello world\n", fp);         //向文件中写入数据
    //char buf[128] = "";
    //fgets(buf, sizeof(buf), fp);

//    printf("buf = %s\n", buf);

    //关闭文件
    fclose(fp);

    return 0;
}

4.打马赛克

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void aa(unsigned char t[],int p)
{
	for (int i=0;i<p;++i)
		printf("%4d",t[i]);
}

int main(int argc,const char *argv[])
{
	//打开图片
	FILE *f;
	if((f=fopen("./111.bmp","r+"))==NULL)
	{
		perror("fopen error");
		return -1;
	}

	unsigned int len,wid;//定义长宽
	fseek(f,18,SEEK_SET);//获得长宽
	fread(&len,4,1,f);
	fread(&wid,4,1,f);
	
	int mlen,mwid;//定义马赛克的长宽
	mlen = mwid = 100;//像素
	
	int l;//计算图片长度能否被马赛克整除
	if(len%mlen)
		l = len/mlen+1;
	else
		l = len/mlen;

	unsigned char colors[l][3];//定义颜色
	fseek(f,54,SEEK_SET);
	int b = len*3%4;//计算余数用于补齐
	for(int i=1;i<=wid;i++)
	{
		for(int j=0;j<len;j++)
		{
			if(i%mwid==1&&j%mlen==0)//记录一行中各列马赛克的颜色
			{
				fread(colors[j/mlen],3,1,f);
				fseek(f,-3,SEEK_CUR);
			}	
				fwrite(colors[j/mlen],3,1,f);
				if(j==len-1&&b)
//像素和每个像素的字节数的乘积需要为4的倍数,不足则会补齐
					fseek(f,4-b,SEEK_CUR);//用于跳过无用字节
		}
	}
	fclose(f);
	return 0;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值