代码出处: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为文件打开方式。
打开之后使用 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 允许负值的出现.下列是较特别的使用方式:
- 欲将读写位置移动到文件开头时:fseek(FILE *stream, 0, SEEK_SET);
- 欲将读写位置移动到文件尾时:fseek(FILE *stream, 0, 0SEEK_END);
再使用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() 获得当前位置相对于文件首的位移,该位移值等于文件所含字节数。
使用 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 字节。
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。
Sleep(50):参数为毫秒数 控制每一张字符打印的时间间隔
函数说明:sleep()会令目前的进程暂停, 直到达到参数seconds 所指定的时间, 或是被信号所中断.