172210704111-陈国佳总结《2017年12月29日》【连续079天】
标题:字符画原理的认识和二进制文件的读写;
内容:
A.今天考了C++,至于如何,就用这张图表示一下:
当然,作为程序员我们可以更委婉更有趣一点:
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH##%%XXDD
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH###%XXDD
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH##%%%XDD
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMHH##%%%XXD
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWH###%%%XD
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWH###%%XDD
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMHH###%XDDD
MMMMMMMMMMMMMMMMMMMMMM%AAD#MMMMMMMMMMMMMMMMMMMMMMMMHH###%%XDD
MMMMMMMMMMMMMMMMMMMX3i{{{+!<+DMMMMMMMMMMMMMMMMMMMMMWH###%XXDD
MMMMMMMMMMMMMMMMMM04DD84pic!7~<HMMMMMMMMMMMMMMMMMMMWH###%XXDD
MMMMMMMMMMMMMMMMWpXDD8A3!:^^.7`^WMMMMMMMMMMMMMMMMMMWHH###%XDD
MMMMMMMMMMMMMMMMwXD8DDAuc^ `{ "MMMMMMMMMMMMMMMMMMMWHH##%XDD
MMMMMMMMMMMMMMMXwADD8w7c!~ .`:{^pMMMMMMMMMMMMMMMMMMMHH##%XDD
MMMMMMMMMMMMMMM?XXDDAw3t` :"{7{77^MMMMMMMMMMMMMMMMMMMMH##%XDD
MMMMMMMMMMMMMM4DXDDD8w3t tu330?w:%MMMMMMMMMMMMMMMMMMMMH#%XDD
MMMMMMMMMMMMMM4DX#M#MMMHA++330034cDMMMMMMMMMMMMMMMMMMMMWH#XXD
MMMMMMMMMMMMMDAMMHH#MMMMMM%?u33+",wMMMMMMMMMMMMMMMMMMMMMH#%XD
MMMMMMMMMMMMMwWMMHH#MMMMMMMMpu8D+ .8MMMMMMMMMMMMMMMMMMMMWH#%X
MMMMMMMMMMMMM#MMM%MAMMMMMMMM###87^<!MMMMMMMMMMMMMMMMMMMMWHH#X
MMMMMMMMMMMMMMMHMXDu%MMMMMM0{D%8Aw4w8MMMMMMMMMMMMMMMMMMMMWH##
MMMMMMMMMMMMMHMX#H3+,%MMMMM3iA?308X8iDMMMMMMMMMMMMMMMMMMMMWHH
MMMMMMMMMMMMMMW#4%8?<<iAD7tt{{t{c"c7+tMMMMMMMMMMMMMMMMMMMMMMH
MMMMMMMMMMMMMMWWAw8?+t~^^{0000+3300+~uMMMMMMMMMMMMMMMMMMMMMM#
MMMMMMMMMMMMMMMXXt!7+^ !8D4wp0+333p44cc%HWMMMMMMMMMMMMMMMMMMX
MMMMMMMMMMMMMMM#^ ^:,^iAw37ttt,t++uipw7,8HWMMMMMMMMMMMMMMMMH8
MMMMMMMMMMMMMMA. :"!^~+~^` .` .``~^t7?!^AHHMMMMMMMMMMMMMMHXD
MMMMMMMMHw4Dwwt^!",^,:^`` ^. .. ^ ::::,,XHHHHWMMMMMMMMMM%DD
MMMMMMMMMMMW#A73c ^,^:^.,,, c,:<. ::"{.^,,<H######WMMMMMW%XDD
MMMMMMMMMMMHDDDu`.^^^7!"i70+0~?A~"t7c0:~`~^0###%%%%%%%##%DDD8
MMMMMMMMMMDA8DD~i^^.!3?73?w47+3D?+03!c?!<""~####%%#%%XXXDDDDD
MMMMMMMM#wp4%%uA?!!c?3{7i{uw~+3pitw{,~u{3{+cp####%%%%XXXDDDDD
MMMMMM4u4AD##D4#<333??!{cc7?~!4+!7{,^,c007?3i#####%%XXDXDDDDD
MMMMMMMMMMMMX4HD!w0?i7<t"+7<<{wc+0"^^^:w?3up7X###%%%%XDDDDDDX
MMMMMMMMMMMHHD%pi4?{tic<"?!"!w{t7c^`:..wtp?34u##%%%%%XXXDDDD%
MMMMMMMMMMMDMD4?0wt<!i+<{7{!p7t+t^`.,``0"?{74+%%%%%%XXXXDDDX#
MMMMMMMMMWDM%D0+p3<~!?i+wu+3cc!!. `:```4^ct7pi8%%%%%XXXXDDDXH
MMMMMMMMMMMMDA0!0u<~!000pp!^~<"` .,`` .u`^77?30%%%%X%XXDDDD%H
MMMMMMMMMMMMD4w~?uc"iuw?7i++c. ``^c++7+<^ii{u7%#%%XXXXDDDD#H
MMMMMMMMMMM%X4p~i3{c0!{`:tt~. ^<t<.``+{{7t#%#%XXXXDDDD#H
MMMMMMMMMMMX#Ap:t47uu.:AMMM4^ ~XMM#!`+{?+"#X#%XXXXXDDX#H
MMMMMMMMMMMD#80,!43?+cMwticA^ `c0{+7Mi"{uc:X#%%XXXDDDXX#W
MMMMMMMMMMM8#D0,<pw?{M3cHA^:^` :?M4^+Mt{7<^8#%%%XXXXDX#MH
MMMMMMMMMMMw#D0,"{4iwH^AMMM<` `.DMMA,%3{i<,p#%%%XXXXX%WHA
MMMMMMMMMMMA#%0,~<?t43.pW#%,`` ```0##D^0p+{",pX#%%%%%%#4D4i
MMMMMMMMMMHD#%p,"!<?,+ "t+{ ``` ````^t+i`t,i{",pD#%%%##Dt+4ic
DMMMMMMMMMX%%%w^~?!+t^^`"+^.``` ``.!+.^^,0t+,3D#%%##3:~wic,
it8MMMMMMM8%X%w^~<77?i^^^^^.````. ``.^^^^^iww":?D%#HHc,.u7c:,
?c,cAMMMMM8D%%p^:!""i?<^^^^.````` ``.^^^^,c!7~:+XDHM?^`c?+~,
tic,:tMMMMD8%%0^:!<~^^^^^^^.```````...^^^^"<4":i4DW8:74?{",
pt+t::wMM#Xp%%0^:<<~^^^^^^..``..`^```.^^^^"{X":{pH#{HDu{"^```
8A{ci,"#MD%3%%3^:<":,^......`.+{{7,``....,~4X"~{8WDMDu{"....^
w48?!+:7#D8pXX3,:c~:~^.......^3300!`.....~uDD""iHWMXu+<^^~!{3
0ppAp<+cpDpDXD0,:iwu3c....``.,7ii?!.^...tw8DD<!3MM8?{c:c?003{
u3330p!+uwp%XDp^~ip03u"......."tt!^....<w4A8A!+4X!?i+!?w03i!<
0??uuup+c34%XD4^~ipp3??t^^.....^^....^<3p4A8Ac7A!w?{+0w07t:..
!{7?777?{c0D%D8^~{pw3u7i7t:^......^^!7u3pw88Dc?pDw?u4p?7{,,,7
0{!<t{7{77uX%XD~~+wA3??7{ic"",^^^,"???30848DDc7XX4AA037c"!7D#
HDpi{+t{708#WXDc~+A83u?0pAt~""""""<D8w3p%8DDD!{X#%8pw0wD###HW
MMWX0+!c{pXWWXDi~tDA030HHWi"""""""<WWD0w#DDDX!cXMM#c`~%HMMMMH
MMMMMX88wwHMM%D3~c%4030D#H?<"""""<uHW40w#DDDX<<%MMD` ,#MMMMH
MMMMMWX#3WMMW%X8:<H4p338DDDD<""""4HHH00w#DDDD<t%MM7 DXMMMH
MMMMMMpD{MMH##XD!"#4p03D%%DDA3??p#MM#ppp#DDDX"u#WM!`.``8M%MMM
MMMMMW4+AMMHH##%?"Aw30004X%XXXXX#MMWXDDDDDXD8<D#WM^`,^^p8w%MM
MMMMM487iAA7iiHuu~<u80~i{+{AXX+i#70++A4c3?i8{+###D w,~H!3XXH#
MMMMM03?AApuw4X7W^Xwc~cX"M"up8tMcw3cM:+M~#!^34#%H8`M^7D{4p#Dw
H0u8%D{MA00w4wH0W"M.. !%H"~uu33wuMc87 #t#~^pw?uH3!3,w430+t::
AX4{<ADM8MW0ww+!W{XA, !MM,`c730<Mi7#c.^8i#~ 0p:,t!?,^u3!{^"!"
30A#80%MXp8Dpp."#~M?i !%+%.^,,^`M,`A?,^H<%".00~^. i,,<,"c+<<"
wDDX%HWMM8HWtM<8u`%8{!<X #+,:,,,M<7!McuM.uD!Mic<^ ^^",:D!iu?{
DDX%#MMMM#MA.!wi``.7A?<?0~i~cc<<u~+7cw3^,^?wt".^^W""W^,c,037+
8AAD%#MMMMMt..````^cXHWM#:,,,~~<u??7!~,,,,?",` .."^,^:```!i7?
ipXD88#MMMH,.....`,^4#%XX+^,,,:{<<i?+!"~,,3D^`^``^,,,. `.!":
4p3upWMMMMD...`...~^DXXXXA<<+?{+737{ccc7ppDA.,....,:<~,.^^!{+
#W%wMMMMMW8..``...:iXDXXXX%XD{ccc+,+tcct8%X+:.^^,ci{{c!"^^cic
MDwtMMMMMH8^.```.,,AXXXXDXXXi<ccc< ^+ccccXD````:{iiii7!A^`!XX
这样一幅字符画就完成了。
程序可以直接从网上找,但同时了解了一下其原理:
1.灰度图:
我们平时看黑白图片时,其像素的亮度(灰度)可以只用一个值来表示。
2.RGB图:
即彩色图片,R(red)G(gray)B(blue),用这三个值来表示一个像素;
当然,如果我们想将一张彩色图片转换成字符画,可以先把它转换成灰度图,
公式:
f(Gray)=R∗0.299+G∗0.587+B∗0.114;
当我们得到一个灰度图时,我们要知道,字符是非黑即白的,但如果我们从原处看,某一块字符的密集程度就可以反映出一些信息,
因此,我们可以先计算图的某区域的平均灰度(用该区域灰度占图片的总灰度),然后用平均灰度相同的字符代替,
当然,在程序实现时,是将图片的灰度储存到一个二维数组,在进行转换;
字符的平均灰度之类可以直接从网上找,也可用ASCLL码来做,
我找到的程序是以C语言实现的,其代码还看不懂,但有些图片转换并不明显,也许我以后可以写出更好的
程序来实现。
B.二进制文件读写:
我们将可以将数据储存进一个二进制文件,其优点如下:
1).所占空间小,如如果将一个五位数存入到txt文本中,其大小为5字节,而以二进制存入时,就算是十位数也只有4字节;
2).方便读入读出,
Linux,Unix的换行符:'\n' (ASCLL码:0x0a)
Windows: '\r\n' (ASCLL码:0x0d0a)
Mac OS: '\r' (ASCLL码:0x0d)
所以Linux,Mac os上的文本文件在windows下打开不换行,
且windows下打开文件,如果不用ios::binary,则
a)读取时,所有'\r\n'会被当作'\n'处理;
b)写入时,单独的'\n'会自动在前加一个'\r';
1.二进制读文件:
istream& read (char*s,long n);
将指针指向的地方的n个字节内容读入到内存地址s,同时指针向后移动n字节;
2.二进制写文件:
istream& write(const char*s,long n);
注意:二进制写文件必须以二进制打开读出;
实例:二进制读写:
先输入几个学生信息,以二进制形式保存:
#include<iostream>
#include<fstream>
using namespace std;
struct Student{
char name[20];
int score;
};
int main()
{
Student s;
ofstream OutFile("c:\\tmp\\students.dat",ios::out|ios::binary);
while(cin>>s.name>>s.score)
OutFile.write((char*)&s,sizeof(s));
OutFile.close();
return 0;
}
读入:
我用记事本打开如下:
Tom )欯 < Jack )欯 P Jane )欯 (
二进制文件读出显示:
int main()
{
Student s;
ifstream inFile("c:\\tmp\\students.dat",ios::in|ios::binary);
if(!inFile){
cout<<"error"<<endl;
return 0;
}
while(inFile.read((char*)&s,sizeof(s))){
int readedBytes=inFile.gcount(); //查看刚刚读入字节个数
cout<<s.name<<" "<<s.score<<endl;
}
inFile.close();
return 0;
}
读写:如将Jane改为Mike
int main()
{
Student s;
fstream iofile("c:\\tmp\\students.dat",ios::in|ios::out|ios::binary);
if(!iofile){
cout<<"error"<<endl;
return 0;
}
iofile.seekp(2*sizeof(s),ios::beg);
iofile.write("Mike",strlen("Mike")+1);
iofile.seekg(0,ios::beg);
while(iofile.read((char*)&s,sizeof(s)))
cout<<s.name<<" "<<s.score<<endl;
iofile.close();
return 0;
}
记得加个头文件<cstring>
运行后,输出结果正确;
明日计划:学习;