代码出处:https://github.com/kisekied/BadAppleStringAnimation

#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
#include <Windows.h>
//#include <conio.h>
#pragma warning(disable : 4996) //消除警告int main(int argc, char const *argv[])
{FILE * fp;fp = fopen("BadAppleStringAnimation-master\\badapple.txt", "r");fseek(fp, 0, SEEK_END);int file_size = ftell(fp);printf("%d\n", file_size);char * tmp;fseek(fp, 0, SEEK_SET);tmp = (char *)malloc(file_size * sizeof(char));fread(tmp, sizeof(char), file_size, fp);char * delim = "nekomark";char * p = NULL;p = strtok(tmp, delim);while (p != NULL){system("cls");printf("%s", p);Sleep(37);   //单位毫秒(ms)p = strtok(NULL, delim);}system("pause");return 0;
}

这个代码简单的理解就是:将字符文件里的字符以一定的速度一段一段地打印出来,得到的效果就是一个用字符组成的动画了。因为要将文件中的字符送入内存中,在之后的读取及分割只需要在内存中去读取数据就好了

现在有字符文件了,我们要做的就是将他打印出来。首先我们要读取这个字符文件,打开一个这个文件并返回其文件指针,fopen()函数就是这个作用。此处 r 为以只读的方式打开。

fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为:
FILE * fopen(const char * path, const char * mode);

【参数】path为包含了路径的文件名,mode为文件打开方式。

fopen参考

打开之后使用 fseek(fp, 0, SEEK_END); 用来移动文件流的读写位置到文件末尾

头文件:#include <stdio.h>

定义函数:int fseek(FILE * stream, long offset, int whence);

函数说明:
fseek()用来移动文件流的读写位置.

1、参数stream 为已打开的文件指针,
2、参数offset 为根据参数whence 来移动读写位置的位移数。参数 whence 为下列其中一种:
SEEK_SET 从距文件开头offset 位移量为新的读写位置. SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量. 当whence 值为SEEK_CUR 或
SEEK_END 时, 参数offset 允许负值的出现.

下列是较特别的使用方式:

  1. 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
  2. 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, 0SEEK_END);

fseek参考

再使用ftell()函数得到文件多少个字节

头文件:#include <stdio.h>

ftell() 函数用来获取文件读写指针的当前位置,其原型为:
long ftell(FILE * stream);

【参数】stream 为已打开的文件指针。

【返回值】成功则返回当前的读写位置,失败返回 -1。

对于二进制文件,则返回从文件开头到结尾的字节数。

对于文本文件,返回的数值可能没有实际意义,但仍然可以用来保存当前的读写位置,供 fseek() 函数使用

在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置。

ftell() 经常和 fseek() 一起使用。例如,利用 ftell() 可以方便地获取一个文件的长:

FILE *fp = fopen("demo.txt","rb");  fseek(fp, 0L, SEEK_END);len =ftell(fp)+1;

首先将文件的位置指针移到文件的末尾,然后调用函数 ftell() 获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。

ftell参考

使用 fseek(fp, 0, SEEK_SET); 将文件流读写位置重新置回到开头

然后用malloc()用来动态分配一段存储空间

fread()函数用于从文件流中读取数据,其原型为:
size_t fread(void *buffer, size_t size, size_t count, FILE * stream);

【参数】buffer为接收数据的地址,size为一个单元的大小,count为单元个数,stream为文件流。

fread()函数每次从stream中最多读取count个单元,每个单元大小为size个字节,将读取的数据放到buffer;文件流的位置指针后移 size * count 字节。

molloc参考

char * delim = “nekomark”; 这句是定义了一个分页的标志,在字符文件中每一页都会有一行此标志(“nekomark”)

接着使用strtok()函数来对字符串分割,并打印被分割出来的那段字符,相当于一张字符画,连续打印就是动画了

头文件:#include <string.h>

定义函数:char * strtok(char *s, const char *delim);

函数说明:strtok()用来将字符串分割成一个个片段。参数s 指向欲分割的字符串,参数delim 则为分割字符串,当strtok()在参数s 的字符串中发现到参数delim 的分割字符时则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s 字符串,往后的调用则将参数s 设置成NULL。每次调用成功则返回下一个分割后的字符串指针。

返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。

strtok参考

Sleep(50):参数为毫秒数 控制每一张字符打印的时间间隔

函数说明:sleep()会令目前的进程暂停, 直到达到参数seconds 所指定的时间, 或是被信号所中断.

Sleep参考

演示效果

badApple讲解说明相关推荐

  1. 手把手教你播放自己的badapple

    一.前言 最近正好学习SD卡,顺手在LED屏上做个badapple玩玩.以为很简单,也耗费了一些时间,故作此记录.希望可以帮到朋友们. 二.准备 我将从各个模块的实现一一讲解,更偏向于思路.OK,我们 ...

  2. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  3. 详细通俗重点CRF层讲解

    本文翻译自GitHub博客上的原创文章,结尾有原文链接.文章没有晦涩的数学公式,而是通过实例一步一步讲解CRF的实现过程,是入门CRF非常非常合适的资料. 相关项目代码: BERT-BiLSMT-CR ...

  4. 高级数据结构讲解与案例分析

    然而,仅仅掌握好它们不足以应付大厂的算法面试的.为了达到对时间和空间复杂度的理想要求,本节课探究高级数据结构,它们的实现要比那些常用的数据结构要复杂得多.其中重点介绍: 优先队列 图 前缀树 线段树 ...

  5. php 伪静态 page-18.html,PHP 伪静态实现技术原理讲解

    PHP 伪静态实现技术原理讲解 发布于 2015-01-18 23:52:58 | 129 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext Pre ...

  6. ssm开发框架原理_SSM 单体框架 - 前端开发:视频讲解

    视频讲解 知乎视频​www.zhihu.com 知乎视频​www.zhihu.com 知乎视频​www.zhihu.com 知乎视频​www.zhihu.com 知乎视频​www.zhihu.com ...

  7. python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)

    前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些东西已经有了,不妨直接去 github 上搜,用 ...

  8. PCL:k-d tree 1 讲解

    1.简介 kd-tree简称k维树,是一种空间划分的数据结构.常被用于高维空间中的搜索,比如范围搜索和最近邻搜索.kd-tree是二进制空间划分树的一种特殊情况.(在激光雷达SLAM中,一般使用的是三 ...

  9. 基础矩阵,本质矩阵,单应性矩阵讲解

    ORB-SLAM点云地图中相机的位姿初始化,无论算法工作在平面场景,还是非平面场景下,都能够完成初始化的工作.其中主要是使用了适用于平面场景的单应性矩阵H和适用于非平面场景的基础矩阵F,程序中通过一个 ...

最新文章

  1. mysql中增加45天三小时_MySQL查询以45天为间隔添加天数并在新列中显示输出
  2. 利用反射操作bean的属性和方法
  3. 面试官系统精讲Java源码及大厂真题 - 32 ReentrantLock 源码解析
  4. 为什么 CSS 这么难学?
  5. Mac怎么终端配置mysql_mysql mac怎么在终端安装
  6. 25 万行逆向源码遭下架!
  7. python发邮件详解_用Python3发送邮件详解
  8. java通过JNI接口调用C语言-初级
  9. 【转】 GitHub 优秀的 Android 开源项目
  10. torch tensor去掉1维_代数拓扑笔记(1) —— 胞腔复形
  11. Qt编程之实现属性窗口编辑器
  12. 单工,半双工,全双工区别以及TDD和FDD区别
  13. 东南大学成贤学院计算机报名,2021上半年江苏东南大学成贤学院计算机等级考试报名通知...
  14. 雷神电脑 ST-plus windows10+ubuntu16.04 双硬盘 双系统超详细安装
  15. python闰年统计_利用Python写一个闰年计算器和每月天数计算器
  16. python:实现newton_forward_interpolation牛顿前插算法(附完整源码)
  17. 房地产行业,怎样获取更多的客户,线上获客渠道有哪些?
  18. 强制删除正在运行的文件
  19. 泛微--考勤 加班申请: 加班天数不对。
  20. Caffe for Python 官方教程

热门文章

  1. UI那点事—从我的经历看GUI发展
  2. 从个人投资者角度看技术分析与基本分析
  3. 6 15种对抗攻击的防御方法
  4. 看智能机器人助力国内民众法律普及
  5. INCA - A2L文件
  6. 第十三篇 VUE中使用头像插件 multiavatar,超级有趣的头像生成插件,提升开发的乐趣
  7. Excel读取03版本和07版本
  8. 1407: 上三角矩阵的判断
  9. 《深入理解计算机系统》--BombLab学习笔记(含隐藏阶段)
  10. 知识点 | Oracle CPU/PSU补丁有啥不同?!