badApple讲解说明

这段代码展示了如何使用C语言读取字符文件,并以特定速度逐段显示内容,实现字符动画效果。通过fopen、fseek、ftell等函数操作文件,strtok进行字符串分割,Sleep控制显示间隔,最终形成动态的字符画面。
摘要由CSDN通过智能技术生成

代码出处: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参考

演示效果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值