




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
此文档收集于网络,如有侵权,请联系网站删除C+编程技巧小结一、使用new和delete进行动态内存分配和释放运算符new和delete是C+新增的运算符,提供了存储的动态分配和释放功能。它的作用相当于C语言的函数malloc()和free(),但是性能更为优越。使用new较之使用malloc()有以下的几个优点:(1)new自动计算要分配类型的大小,不使用sizeof运算符,比较省事,可以避免错误。(2)自动地返回正确的指针类型,不用进行强制指针类型转换。(3)可以用new对分配的对象进行初始化。使用例子:(1)int p;p=new int10; /分配一个含有10个整数的整形数组delete p; /删除这个数组(2)int p;p=new int (100);/动态分配一个整数并初始化二、使用inline内连函数替代宏调用对于频繁使用的函数,C语言建议使用宏调用代替函数调用以加快代码执行,减少调用开销。但是宏调用有许多的弊端,可能引起不期望的副作用。例如宏:#define abs(a) (a)0?(-a):(a), 当使用abs(I+)时,这个宏就会出错。所以在C+中应该使用inline内连函数替代宏调用,这样既可达到宏调用的目的,又避免了宏调用的弊端。使用内连函数只须把inline关键字放在函数返回类型的前面。例如:inline int Add(int a,int b);/声明Add()为内连函数这样编译器在遇到Add()函数时,就不再进行函数调用,而是直接嵌入函数代码以加快程序的执行。三、使用函数重载在C语言中,两个函数的名称不能相同,否则会导致编译错误。而在C+中,函数名相同而参数不同的两个函数被解释为重载。例如:void PutHzchar str /在当前位置输出汉字void PutHzint xint ychar str /在x,y处输出汉字使用函数重载可以帮助程序员处理更多的复杂问题,避免了使用诸如intabs()、fabs()、dabs()等繁杂的函数名称;同时在大型程序中,使函数名易于管理和使用,而不必绞尽脑汁地去处理函数名。四、使用引用(reference)代替指针进行参数传递在C语言中,如果一个函数需要修改用作参数的变量值的时候 ,参数应该声明为指针类型。例如:void Addint a a+但是对于复杂的程序,使用指针容易出错,程序也难以读懂。在C+中,对于上述情况 可以使用引用来代替指针,使程序更加清晰易懂。引用就是对变量取的一个别名,对引用进行操作,这就相当于对原有变量进行操作。例如使用引用的函数定义为:void Addint a a+ /a为一个整数的引用文件 I/O 在C+中比烤蛋糕简单多了。 在这篇文章里,我会详细解释ASCII和二进制文件的输入输出的每个细节,值得注意的是,所有这些都是用C+完成的。一、ASCII 输出为了使用下面的方法, 你必须包含头文件(译者注:在标准C+中,已经使用取代,所有的C+标准头文件都是无后缀的。)。这是 的一个扩展集, 提供有缓冲的文件输入输出操作. 事实上, 已经被包含了, 所以你不必包含所有这两个文件, 如果你想显式包含他们,那随便你。我们从文件操作类的设计开始, 我会讲解如何进行ASCII I/O操作。如果你猜是fstream, 恭喜你答对了! 但这篇文章介绍的方法,我们分别使用ifstream?和 ofstream 来作输入输出。如果你用过标准控制台流cin?和 cout, 那现在的事情对你来说很简单。 我们现在开始讲输出部分,首先声明一个类对象。ofstream fout;这就可以了,不过你要打开一个文件的话, 必须像这样调用ofstream:open()。fout.open(output.txt);你也可以把文件名作为构造参数来打开一个文件.ofstream fout(output.txt);这是我们使用的方法, 因为这样创建和打开一个文件看起来更简单. 顺便说一句, 如果你要打开的文件不存在,它会为你创建一个, 所以不用担心文件创建的问题. 现在就输出到文件,看起来和cout的操作很像。 对不了解控制台输出cout的人, 这里有个例子。int num = 150;char name = John Doe;fout Here is a number: num n;fout Now here is a string: name n;现在保存文件,你必须关闭文件,或者回写文件缓冲. 文件关闭之后就不能再操作了, 所以只有在你不再操作这个文件的时候才调用它,它会自动保存文件。 回写缓冲区会在保持文件打开的情况下保存文件, 所以只要有必要就使用它。回写看起来像另一次输出, 然后调用方法关闭。像这样:fout flush; fout.close(); 现在你用文本编辑器打开文件,内容看起来是这样:Here is a number: 150 Now here is a string: John Doe很简单吧! 现在继续文件输入, 需要一点技巧, 所以先确认你已经明白了流操作,对 比较熟悉了, 因为你接下来还要用到他们。继续二、ASCII 输入输入和cin 流很像. 和刚刚讨论的输出流很像, 但你要考虑几件事情。在我们开始复杂的内容之前, 先看一个文本:12 GameDev 15.45 L This is really awesome!为了打开这个文件,你必须创建一个in-stream对象,?像这样。ifstream fin(input.txt);现在读入前四行. 你还记得怎么用 操作符往流里插入变量和符号吧?好,?在 (提取) 操作符. 使用方法是一样的. 看这个代码片段.int number;float real;char letter, word8;fin number; fin word; fin real; fin letter;也可以把这四行读取文件的代码写为更简单的一行。fin number word real letter;它是如何运作的呢? 文件的每个空白之后, 操作符会停止读取内容, 直到遇到另一个操作符. 因为我们读取的每一行都被换行符分割开(是空白字符), 操作符只把这一行的内容读入变量。这就是这个代码也能正常工作的原因。但是,可别忘了文件的最后一行。This is really awesome!如果你想把整行读入一个char数组, 我们没办法用?操作符,因为每个单词之间的空格(空白字符)会中止文件的读取。为了验证:char sentence101; fin sentence;我们想包含整个句子, This is really awesome! 但是因为空白, 现在它只包含了This. 很明显, 肯定有读取整行的方法, 它就是getline()。这就是我们要做的。fin.getline(sentence, 100);这是函数参数. 第一个参数显然是用来接受的char数组. 第二个参数是在遇到换行符之前,数组允许接受的最大元素数量. 现在我们得到了想要的结果:“This is really awesome!”。你应该已经知道如何读取和写入ASCII文件了。但我们还不能罢休,因为二进制文件还在等着我们。三、二进制 输入输出二进制文件会复杂一点, 但还是很简单的。首先你要注意我们不再使用插入和提取操作符(译者注: 操作符). 你可以这么做,但它不会用二进制方式读写。你必须使用read() 和write() 方法读取和写入二进制文件. 创建一个二进制文件, 看下一行。ofstream fout(file.dat, ios:binary);这会以二进制方式打开文件, 而不是默认的ASCII模式。首先从写入文件开始。函数write() 有两个参数。 第一个是指向对象的char类型的指针, 第二个是对象的大小(译者注:字节数)。 为了说明,看例子。int number = 30; fout.write(char *)(&number), sizeof(number);第一个参数写做(char *)(&number). 这是把一个整型变量转为char *指针。如果你不理解,可以立刻翻阅C+的书籍,如果有必要的话。第二个参数写作sizeof(number). sizeof() 返回对象大小的字节数. 就是这样!二进制文件最好的地方是可以在一行把一个结构写入文件。 如果说,你的结构有12个不同的成员。 用ASCII?文件,你不得不每次一条的写入所有成员。 但二进制文件替你做好了。 看这个。struct OBJECT int number; char letter; obj;obj.number = 15;obj.letter = M;fout.write(char *)(&obj), sizeof(obj);这样就写入了整个结构! 接下来是输入. 输入也很简单,因为read()?函数的参数和 write()是完全一样的, 使用方法也相同。ifstream fin(file.dat, ios:binary); fin.read(char *)(&obj), sizeof(obj);我不多解释用法, 因为它和write()是完全相同的。二进制文件比ASCII文件简单, 但有个缺点是无法用文本编辑器编辑。 接着, 我解释一下ifstream 和ofstream 对象的其他一些方法作为结束.四、更多方法我已经解释了ASCII文件和二进制文件, 这里是一些没有提及的底层方法。检查文件你已经学会了open() 和close() 方法, 不过这里还有其它你可能用到的方法。方法good() 返回一个布尔值,表示文件打开是否正确。类似的,bad() 返回一个布尔值表示文件打开是否错误。 如果出错,就不要继续进一步的操作了。最后一个检查的方法是fail(), 和bad()有点相似, 但没那么严重。读文件方法get() 每次返回一个字符。方法ignore(int,char) 跳过一定数量的某个字符, 但你必须传给它两个参数。第一个是需要跳过的字符数。 第二个是一个字符, 当遇到的时候就会停止。 例子,fin.ignore(100, n);会跳过100个字符,或者不足100的时候,跳过所有之前的字符,包括 n。方法peek() 返回文件中的下一个字符, 但并不实际读取它。所以如果你用peek() 查看下一个字符, 用get() 在peek()之后读取,会得到同一个字符, 然后移动文件计数器。方法putback(char) 输入字符, 一次一个, 到流中。我没有见到过它的使用,但这个函数确实存在。写文件只有一个你可能会关注的方法.?那就是 put(char), 它每次向输出流中写入一个字符。打开文件当我们用这样的语法打开二进制文件:ofstream fout(file.dat, ios:binary);ios:binary是你提供的打开选项的额外标志. 默认的, 文件以ASCII方式打开, 不存在则创建, 存在就覆盖. 这里有些额外的标志用来改变选项。ios:app 添加到文件尾ios:ate 把文件标志放在末尾而非起始。ios:trunc 默认. 截断并覆写文件。ios:nocreate 文件不存在也不创建。ios:noreplace 文件存在则失败。文件状态我用过的唯一一个状态函数是eof(), 它返回是否标志已经到了文件末尾。 我主要用在循环中。 例如, 这个代码断统计小写e 在文件中出现的次数。ifstream fin(file.txt);char ch; int counter;while (!fin.eof() ch = fin.get();if (ch = e) counter+;fin.close();我从未用过这里没有提到的其他方法。 还有很多方法,但是他们很少被使用。参考C+书籍或者文件流的帮助文档来了解其他的方法。结论你应该已经掌握了如何使用ASCII文件和二进制文件。有很多方法可以帮你实现输入输出,尽管很少有人使用他们。我知道很多人不熟悉文件I/O操作,我希望这篇文章对你有所帮助。 每个人都应该知道. 文件I/O还有很多显而易见的方法,?例如包含文件 . 我更喜欢用流是因为他们更【程序91】题目:时间函数举例11.程序分析:2.程序源代码:#includestdio.h#includetime.hvoidmain()time_tlt;/*definealonginttimevarible*/lt=time(NULL);/*systemtimeanddate*/printf(ctime();/*englishformatoutput*/printf(asctime(localtime();/*tranfertotm*/printf(asctime(gmtime();/*tranfertoGreenwichtime*/=【程序92】题目:时间函数举例21.程序分析:2.程序源代码:/*calculatetime*/#includetime.h#includestdio.hmain()time_tstart,end;inti;start=time(NULL);for(i=0;i3000;i+)printf(1111111111n);end=time(NULL);printf(1:Thedifferentis%6.3fn,difftime(end,start);=【程序93】题目:时间函数举例31.程序分析:2.程序源代码:/*calculatetime*/#includetime.h#includestdio.hmain()clock_tstart,end;inti;doublevar;start=clock();for(i=0;ii)printf(pleaseinputalittlesmaller.n);scanf(%d,&guess);elseprintf(pleaseinputalittlebigger.n);scanf(%d,&guess);end=clock();b=time(NULL);printf(1:Ittookyou%6.3fsecondsn,var=(double)(end-start)/18.2);printf(1:ittookyou%6.3fsecondsnn,difftime(b,a);if(var15)printf(11Youareveryclever!11nn);elseif(var25)printf(11youarenormal!11nn);elseprintf(11youarestupid!11nn);printf(11Congradulations11nn);printf(Thenumberyouguessis%d,i);printf(ndoyouwanttotryitagain?(yy.or.n)n);if(c=getch()=y)gotoloop;=【程序95】题目:家庭财务管理小程序1.程序分析:2.程序源代码:/*moneymanagementsystem*/#includestdio.h#includedos.hmain()FILE*fp;structdated;floatsum,chm=0.0;intlen,i,j=0;intc;charch4=,ch116=,chtime12=,chshop16,chmoney8;pp:clrscr();sum=0.0;gotoxy(1,1);printf(|-|);gotoxy(1,2);printf(|moneymanagementsystem(C1.0)2000.03|);gotoxy(1,3);printf(|-|);gotoxy(1,4);printf(|-moneyrecords-|-todaycostlist-|);gotoxy(1,5);printf(|-|-|);gotoxy(1,6);printf(|date:-|);gotoxy(1,7);printf(|);gotoxy(1,8);printf(|-|);gotoxy(1,9);printf(|thgs:-|);gotoxy(1,10);printf(|);gotoxy(1,11);printf(|-|);gotoxy(1,12);printf(|cost:-|);gotoxy(1,13);printf(|);gotoxy(1,14);printf(|-|);gotoxy(1,15);printf(|);gotoxy(1,16);printf(|);gotoxy(1,17);printf(|);gotoxy(1,18);printf(|);gotoxy(1,19);printf(|);gotoxy(1,20);printf(|);gotoxy(1,21);printf(|);gotoxy(1,22);printf(|);gotoxy(1,23);printf(|-|);i=0;getdate(&d);sprintf(chtime,%4d.%02d.%02d,d.da_year,d.da_mon,d.da_day);for(;)gotoxy(3,24);printf(Tab_browsecostlistEsc_quit);gotoxy(13,10);printf();gotoxy(13,13);printf();gotoxy(13,7);printf(%s,chtime);j=18;ch0=getch();if(ch0=27)break;strcpy(chshop,);strcpy(chmoney,);if(ch0=9)mm:i=0;fp=fopen(home.dat,r+);gotoxy(3,24);printf();gotoxy(6,4);printf(listrecords);gotoxy(1,5);printf(|-|);gotoxy(41,4);printf();gotoxy(41,5);printf(|);while(fscanf(fp,%10s%14s%fn,chtime,chshop,&chm)!=EOF)if(i=36)getch();i=0;if(i%36)16)gotoxy(41,4+i-17);printf();gotoxy(42,4+i-17);i+;sum=sum+chm;printf(%10s%-14s%6.1fn,chtime,chshop,chm);gotoxy(1,23);printf(|-|);gotoxy(1,24);printf(|);gotoxy(1,25);printf(|-|);gotoxy(10,24);printf(totalis%8.1f$,sum);fclose(fp);gotoxy(49,24);printf(pressanykeyto.);getch();gotopp;elsewhile(ch0!=r)if(j15)len=len+1;j=11;strcpy(ch1,);j=j-2;strncat(ch1,chtime,len);strcpy(chtime,);strncat(chtime,ch1,len-1);gotoxy(13,7);printf();gotoxy(13,7);printf(%s,chtime);ch0=getch();if(ch0=9)gotomm;if(ch0=27)exit(1);gotoxy(3,24);printf();gotoxy(13,10);j=0;ch0=getch();while(ch0!=r)if(j14)strncat(chshop,ch,1);j+;if(ch0=8)len=strlen(chshop)-1;strcpy(ch1,);j=j-2;strncat(ch1,chshop,len);strcpy(chshop,);strncat(chshop,ch1,len-1);gotoxy(13,10);printf();gotoxy(13,10);printf(%s,chshop);ch0=getch();gotoxy(13,13);j=0;ch0=getch();while(ch0!=r)if(j=a&stri=z)stri=stri-32;fputc(stri,fp);i+;fclose(fp);fp=fopen(test,r);fgets(str,strlen(str)+1,fp);printf(%sn,str);fclose(fp);=【程序99】题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件C中。1.程序分析:2.程序源代码:#includestdio.hmain()FILE*fp;inti,j,n,ni;charc160,t,ch;if(fp=fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肾内科医生外出进修汇报
- 消防基本常识与公共基础知识题库(含答案)
- 2025年事业单位工勤技能-海南-海南水土保持工三级(高级工)历年参考题库含答案解析
- 2025-2030中国糖蜜行业供需态势及消费趋势预测报告
- 2025年事业单位工勤技能-浙江-浙江医技工三级(高级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河南-河南防疫员三级(高级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-河南-河南管道工一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-河南-河南林木种苗工三级(高级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-河北-河北防疫员五级(初级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-江西-江西环境监测工四级(中级工)历年参考题库含答案解析(5套)
- 2024年工会财务知识竞赛试题及答案
- 26个英语字母描红练习(素材)-小学英语
- DL∕T 686-2018 电力网电能损耗计算导则
- 糖尿病医疗广告宣传指南
- 2023年河南省中考数学试卷及答案
- 中外民歌欣赏(高中音乐课件)
- Revit-基础教程课件
- 大学美育(第二版) 课件 第五单元:书法艺术
- 消防工程技术咨询合同
- 从《史记》看司马迁的命运观
- 高中新外研版单词总表(必修123+选修1234)
评论
0/150
提交评论