问题 : C语言实习题八——ASCII字模文件
时间限制: 1 Sec 内存限制: 128 MB
提交: 2873 解决: 1337
[提交][状态][讨论版]
题目描述
请编程从字模文件ASC10x8.dic中读取指定字符串中ASCII字符的点阵字模并用“#”显示在屏幕上。
字模文件中存放了0x20到0x7E共95个ASCII字符的点阵字模数据,每个ASCII字符对应10个字节,如:
A的字模数据(ASCII值为0x41,字模数据在文件中的偏移量为(0x41-0x20)*10=330)为:0x00,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC
~~~~~~~~ //0x00(以下用~示意空格)
~~~~~~~~ //0x00
~~#~~~~~ //0x20
~~#~~~~~ //0x20
~~##~~~~ //0x30
~#~#~~~~ //0x50
~#~#~~~~ //0x50
~####~~~ //0x78
~#~~#~~~ //0x48
#~#~#~#~ //0xCC
字模文件为二进制文件,本地调试时可从这里下载。
输入
待输出字符串,仅包含英文ASCII字符,长度不超过20个字符。
输出
字符串对应的字模点阵信息
样例输入
ABC
样例输出
# #### #### # # # # # ## # # # # # ### # # # # # # #### # # # # # # # # # # # # # #### ###
提示
在程序需要当前下使用名为"ASC10x8.dic"的字模文件,注意文件名大小写,并以二进制方式打开。
代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stdarg.h>
int main() {
FILE* fp = fopen("ASC10x8.dic", "rb");
int i, j,k;
char s[20] = { 0 };
fgets(s, 20, stdin);
char* p = s;
// 申请动态二维数组
int length = strlen(s);
s[length - 1] = '\0';
length = strlen(s);
unsigned char** arr = (unsigned char**)calloc(10, sizeof(unsigned char*));
for (i = 0; i < 10; i++) {
arr[i] = (unsigned char*)calloc(length, 1);
}
// 将二进制文件放进二位数组
for (i = 0; i < length; i++) {
for (j = 0; j < 10; j++) {
int pian_yi = (*(p+i) - 32) * 10;
fseek(fp, pian_yi+j, SEEK_SET);
fread(&arr[j][i], 1, 1, fp);
}
}
// 将二进制文件打印出来
for (i = 0; i < 10; i++) {
for (j = 0; j < length; j++) {
int arr_bool_[8] = { 0 };
int bit = 7;
while (bit >= 0) {
arr_bool_[bit] = arr[i][j] % 2;
arr[i][j] >>= 1;
bit--;
}
for (k = 0; k < 8; k++) {
if (arr_bool_[k] == 0) {
printf(" ");
}
else
{
printf("#");
}
}
}
printf("\n");
}
fclose(fp);
return 0;
}