谁知道c++的好处?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谁知道c++的好处?相关的知识,希望对你有一定的参考价值。

Microsoft Visual C++ 6.0

一 学习C++,未来让你充满期待

C++是一门很有前景的软件编程语言,C++是在C语言的基础上开发的一种通用编程语言,应用广泛。C++支持多种编程范式 --面向对象编程、泛型编程和过程化编程。最新正式标准C++14于2014年8月18日公布。其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类、封装、重载等特点,废话少说,学好了C++,可以从事非常多的工作,很多的优秀的C++工作人元,工资往往秒杀Java等程序员。

二 学习C++其实很简单,没你想的那么难

很多学编程的人为什么学的一塌糊涂,他们不是能力不行,而是心态不行,总觉的编程C++难,遇到一点问题就各种纠结无助,或者有很多喜欢学习C++的小伙伴,非常的努力,买了这方面的各种书籍,也从网上看各种视频教程,最后学的还是一头无税半斤八两,只能对自己说,我曾经努力过,我只能说,呵呵了。其实你们这些学习的方法都太落后了,早就被淘汰了,你们这种学习的方法,学习的效率非常的低,往往一个人战斗,是没有动力坚持下去的。

还是让我给大家指点一下迷津吧,现在在学习C++方面最先进的学习方法是看互动式直播视频教学,就是你可以通过电脑现场听课,有问题当场问老师,可以和许多人在 一块学,如果你有不明白的,下课后,还可以看视频的回放,这才是高大上的学习方法。这种学习模式谁能做到?当然是我们,如果你想学的话,可以加一下这个群,开头的前面一组是:四三七,位于中间位置的一组是:五零八,最后的一组是:七九四。按照顺序组合起来,你就能发现学习的新大陆,而你只需要来学就可以,什么都不需要你付出,一毛钱也不需要,
  
三 C++发展历史简单介绍

  C语言之所以要起名为“C”,是因为它是主要参考那个时候的一门叫B的语言,它的设计者认为C语言是B语言的进步,所以就起名为C语言;但是B语言并不是因为之前还有个A语言,而是B语言的作者为了纪念他的妻子,他的妻子的第一个字母是B; 当C语言发展到顶峰的时刻,出现了一个版本叫C with Class,那就是C++最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的++运算符来体现它是C语言的进步,所以就叫C++,也成立了C++标准委员会;

  美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC 1488-1998。C++是具有国际标准的编程语言,通常称作ANSI/ISO C++。1998年是C++标准委员会成立的第一年,以后每5年视实际需要更新一次标准,下一次标准更新将是在2009年,目前我们一般称该标准C++0x。遗憾的是,由于C++语言过于复杂,以及他经历了长年的演变,直到现在(2009年)只有Visual C++ 2010 CTP开发环境的编译器完全符合这个标准。

  另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。根据《C++编程思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。所以有人认为在大多数场合C++ 完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)。 [编辑本段]【子语言】  根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成:

  1、C子语言。C++支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。

  2、面向对象的C++。C++首先作为一门面向对象的语言而闻名,这个特点在这里不再详述。

  3、泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。

  4、STL(C++标准模板库)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的naive代码低些,但是其安全性与规范性使它大受欢迎。 [编辑本段]【语言发展】 

 C++语言发展大概可以分为三个阶段:

第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;

第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;

第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

【C++入门】  C++是一种语言,仅仅是它的语法、特性、标准类库就已经是一门非常高深的课程,所以在开始学习的时候,必须先要打好基础。在市面上有很多Visual C++的书,虽然其中可能会花1-2章来介绍C++的基本特性,但是那绝对不会让你入门。因此,初学者学习C++应该选择针对C++语言本身的书籍,而不能是针对Visual C++、MFC或者Windows API的。
  学习C++应该由易至难,循序渐进。以前经常有人说学习C++之前应该学习C语言。事实上那不是必须的,C++和C语言虽然有关系,但仍然是两种不同的语言。当然,在学习C++之前学习过其他编程语言是很有好处的。那会使学习C++的速度更快,毕竟很多计算机语言的概念都是相通的。而对于零基础的初学者来说,则是应该静下心来,不要急躁。要成为C++的高手,不是那么容易的,必须要花很大的努力。

  从入门教材的选择上,主要看学习者的自身情况。如果已经有过学习高级语言的经历,那么推荐使用谭浩强的《C++程序设计》。注意是04年版的,06年版的那本书是阉割版,上来就面向对象。虽然说C和C++是相似的,但是前面已经说了,C和C++应该作为两种语言来学习,所以06年的那本内容就稍微欠缺一点了。谭浩强04版的这本书内容比较规整的,条理也很清晰。如果有过其他高级语言的基础,那么估计半年就能对C++的概况有个了解了。谭浩强老师的书已经成为了全国各大高等院校的教科书,是比较受到认可的。

  如果是从零基础开始学C++,那么推荐使用潘嘉杰的《易学C++》。这本书是2008年出的新书,听说是个学生在读书的时候写的。这本书网上有下载免费的电子版。。这本书主要就是针对初学者的,讲得也比较生动有趣,比较提得起学习的兴趣。所以没有基础的初学者选这本书也是不错的,就是想要很快成为高手,可能看这本书还不够。至于看完入门的书之后,就应该看一些高层次的书了。比如The C++ Programming Language和C++ Primer,同时也可以向STL、MFC、API等各个方向发展。如果对别的语言感兴趣,还能去看看C#和Java,它们和C++从语法和很多概念上都是类似的。 [编辑本段]【C++的设计原则】  ?? C++设计成静态类型、和C同样高效且可移植的多用途程序设计语言。
  ?? C++设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。
  ?? C++设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。
  ?? C++设计成尽可能与C兼容,籍此提供一个从C到C++的平滑过渡。
  ?? C++避免平台限定或没有普遍用途的特性。
  ?? C++不使用会带来额外开销的特性。
  ?? C++设计成无需复杂的程序设计环境。
  出于保证语言的简洁和运行高效等方面的考虑,C++的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,C++之父的《C++语言的设计和演化》 里做了详尽的陈述。 [编辑本段]【C++的Hello World程序】  在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:
  (事实上这并不是符合98标准[ISO C++]的C++程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将iostream改为iostream.h)
  #include <iostream>
  int main()
  
  printf("Hello, world!\\n");
  return 0;
  
  在使用兼容C++98标准(ISO/IEC 14882-1998)的编译器时,下面的程序也是可以的:
  #include <iostream.h>
  int main()
  
  cout << "Hello, world!" << endl;
  return 0;
  
  在使用兼容C++ STL的编译器时,应当是:
  #include <iostream>
  using namespace std;
  int main()
  
  cout<<"Hello,world!"<<endl;
  return 0;
  
  根据ISO C++的规定,main函数的形式只能是
  int main(void)
  
  ...
  
  以及
  int main(int argc,char * argv[])
  
  ...
  
  尽管如此,但在Visual C++ 2003以前的Microsoft Studio编译器上,
  void main()
  
  ...
  
  也被支持,但这并不正确,也不标准。这样的写法会使程序代码丧失跨平台的特性。 [编辑本段]【C++程序员的数量】  分析机构EvansData定期对开发人员展开调查,其调查结果与Stroustrup提出的C++正在扩张的说法相违背。EvansData的数据显示,以C++为工具的开发人员在整个开发界所占的比例由1998年春天的76%下降至2004年秋的46%。
  Forrester最新的调查显示,C++、微软VisualBasic和Java是众多公司产品体系的首选语言。对100家公司的调查显示,C/C++、VisualBasic和Java在产品体系中的使用比例分别是59%、61%和66%。

  传统上认为,C++相对于目前一些新潮的语言,如Java、C#,优势在于程序的运行性能。这种观念并不完全。如果一个人深信这一点,那么说明他并没有充分了解和理解C++和那个某某语言。同时,持有这种观念的人,通常也是受到了某种误导(罪魁祸首当然就是那些财大气粗的公司)。对于这些公司而言,他们隐藏了C++同某某语言间的核心差别,而把现在多数程序员不太关心的差别,也就是性能,加以强化。因为随着CPU性能的快速提升,性能问题已不为人们所关心。这叫“李代桃僵”。很多涉世不深的程序员,也就相信了他们。于是,大公司们的阴谋也就得逞了。

  一般认为,使用Java或C#的开发成本比C++低。但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。造成这种差别的就是C++的软件工程性。在Java和C#大谈软件工程的时候,C++实际上已经悄悄地将软件工程性提升到一个前所未有的高度。这一点被多数人忽视,并且被大公司竭力掩盖。
  语言在软件工程上的好坏,依赖于语言的抽象能力。从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。但在实践中,人们发现面向对象无法解决所有软件工程中的问题。于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。(实际上,面向对象和泛型编程的起源都可以追溯到1967年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。 [编辑本段]【C++语言的应用】  哪些程序是用C++写的:
  主流的3种操作系统Windows,Linux,Unix,内核都是用C语言和汇编写的,上层高级特性是用C++写的。
  
  C++之父Bjarne Stroustrup列举的C++应用:
  Amazon.com:Software for large-scale e-commerce
  Apple: OS X is written in a mix of language, but a few important parts are C++. The two most interesting are
  AT&T:The largest US telecommunications provider.
  o provisioning systems
  o systems for rapid network recovery after failure
  Autodesk: A large number of major number of application in the CAD domain
  Ericsson:o server platform.
  o TDMA-CDMA HLR
  o GSM-TDMA-CDMA mobility gateway
  Google: web search engine, etc。
  HP: Here is a tiny fraction of HP\'s C++ apps:
  o C, C++, Fortran90 compilers, and linker for the new HP IA64 platform (these add to more than 1 million lines of C++ code).
  IBM: o OS/400.
  o K42: a high performance, open source, general-purpose operating system kernel for cache-coherent multiprocessors.
  Intel:o Vtune performace analysis software
  o compilers and optimizers
  o lots of chip design and manufacturing software
  JPL (Jet Propulsion Lab, NASA): Mars rover autonomous driving system (incl. scene analysis and route planning). C++ on Mars! Also lots of supporting software "on the ground" (i.e. Earth).
  Microsoft:o Windows XP
  o Windows NT (NT4 and 2000)
  o Windows 9x (95, 98, Me)
  o Microsoft Office (Word, Excel, Access, PowerPoint, Outlook)
  o Internet Explorer (including Outlook Express)
  o Visual Studio
  o SQL
  Mozilla: Firefox browser and Thunderbird mail client (open source)
  mysql: MySQL Server (about 250,000 lines of C++) and MySQL Cluster. Arguably the world\'s most popular open source database
  Nokia: o Mobile Communications radio-station/internet bridges: FlexiGGSN (Gateway GPRS Support Node) and FlexiSGSN (Server GPRS Support Node).
  o MSC/HLR
  Sun: o The HotSpot Java Virtual Machine is written in C++
  Symbian OS: rationale: "[...] using C++ for all system code, from the kernel upwards." This is one of the most widespread OS\'s for cellular phones
  KDE from linux is written in C++.
  telephone systems: I think it would be almost easier to list the systems which aren\'t written in C++
参考技术A 【概述】
C++,这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。

贝尔实验室的本贾尼·斯特劳斯特卢普(w:en:Bjarne Stroustrup)博士在20世纪80年代发明并实现了C++(最初这种语言被称作“C with Classes”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC 14882-1998。遗憾的是,由于C++语言过于复杂,以及他经历了长年的演变,直到现在(2004年)只有少数几个编译器完全符合这个标准(这么说也是不完全正确的,事实上,至今为止没有任何一款编译器完全支持ISO C++)。

另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。根据《C++编程思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。所以有人认为在大多数场合C++ 完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)。

【子语言】
根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成:

1、C子语言。C++支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。
2、面向对象的C++。C++首先作为一门面向对象的语言而闻名,这个特点在这里不再详述。
3、泛型编程语言。C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。
4、STL(C++标准模板库)。随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的naive代码低些,但是其安全性与规范性使它大受欢迎。

【语言发展】
C++语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。

【C++的Hello World程序】

在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行:
(事实上这并不是符合98标准[ISO C++]的C++程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将iostream改为iostream.h)

#include <iostream>

int main()



std::cout << "Hello, world!\n";



在使用兼容C99标准(ISO/IEC 14882-1998)的编译器时,下面的程序也是可以的:

#include <iostream>

using namespace std;

int main()



cout << "Hello, world!" << endl;

return 0;



根据ISO C++的规定,main函数的形式只能是

int main()



...



以及

int main(int argc,char * argv[])



...



尽管如此,但在大部份(其实是在Windows平台下的大部分)编译器上,

void main()



...



也被支持。

【C++程序员的数量】

分析机构EvansData定期对开发人员展开调查,其调查结果与Stroustrup提出的C++正在扩张的说法相违背。EvansData的数据显示,以C++为工具的开发人员在整个开发界所占的比例由1998年春天的76%下降至2004年秋的46%。

Forrester最新的调查显示,C++、微软VisualBasic和Java是众多公司产品体系的首选语言。对100家公司的调查显示,C/C++、VisualBasic和Java在产品体系中的使用比例分别是59%、61%和66%。

传统上认为,C++相对于目前一些新潮的语言,如Java、C#,优势在于程序的运行性能。这种观念并不完全。如果一个人深信这一点,那么说明他并没有充分了解和理解C++和那个某某语言。同时,持有这种观念的人,通常也是受到了某种误导(罪魁祸首当然就是那些财大气粗的公司)。对于这些公司而言,他们隐藏了C++同某某语言间的核心差别,而把现在多数程序员不太关心的差别,也就是性能,加以强化。因为随着cpu性能的快速提升,性能问题已不为人们所关心。这叫“李代桃僵”。很多涉世不深的程序员,也就相信了他们。于是,大公司们的阴谋也就得逞了。

一般认为,使用Java或C#的开发成本比C++低。但是,如果你能够充分分析C++和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C++的优势将会越来越明显。
造成这种差别的就是C++的软件工程性。在Java和C#大谈软件工程的时候,C++实际上已经悄悄地将软件工程性提升到一个前所未有的高度。这一点被多数人忽视,并且被大公司竭力掩盖。

语言在软件工程上的好坏,依赖于语言的抽象能力。从面向过程到面向对象,语言的抽象能力有了一个质的飞跃。但在实践中,人们发现面向对象无法解决所有软件工程中的问题。于是,精英们逐步引入、并拓展泛型编程,解决更高层次的软件工程问题。(实际上,面向对象和泛型编程的起源都可以追溯到1967年,但由于泛型编程更抽象,所以应用远远落后于面向对象)。
参考技术B c++的好处是他是一个面向对象的语言,而且可以操控内存。

谁知道 文件分割合并工具的 C++源码啊?

实现基本功能就行

给你个Java的
public class FileCut
/*cl_tl*/

private Shell shell;
private Display display;
private Text txtSourceFile;
private Text txtNewFilePath;
private Text txtFileSize;
private Button btnChooseFile;
private Button btnChoosePath;
private Button btnCut;
private Button btnUnionFiles;
private Button btnUp;
private Button btnDown;
private Button btnClear;
private Button btnClearAll;
private Button btnUnion;
private Table tblFileList;

private File sourceFile = null; /*源文件*/
private File[] newFile = null; /*分割后产生的文件*/
private int fileCount = 0; /*分割成的文件个数*/
private int fileSize = 0; /*分割的文件块大小*/
private String strSourceFile = null; /*源文件路径及名称*/
private String strNewFilePath = null; /*分割文件存放路径*/

public static void main(String[] args)

Display display=new Display();
FileCut Item=new FileCut();
Item.createShell();

while( !Item.shell.isDisposed())

if(!display.readAndDispatch())
display.sleep();

display.dispose();


/*fn_hd
*rem:创建窗体
*aut:
*log:2005-11-24
*/
private void createShell()
/*fn_tl*/

shell = new Shell(display, SWT.MIN);
shell.setBounds(300,250,500,330);
shell.setText("文件分割合并");
GridLayout shellLayout = new GridLayout();
shellLayout.numColumns = 3;
shell.setLayout(shellLayout);
createWidgets();
shell.open();


/**fn_hd
*rem:在窗体内添加控件
*per:
*aut:
*log:2005-11-24
*/
private void createWidgets()
/*fn_tl*/

final Label lblNull0 = new Label(shell,SWT.None);
GridData gd0 = new GridData();
gd0.horizontalSpan = 3;
lblNull0.setLayoutData(gd0);

final Label lblSourceFile = new Label(shell, SWT.None);
lblSourceFile.setText("源 文 件");

GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
txtSourceFile = new Text(shell, SWT.BORDER);
txtSourceFile.setLayoutData(gd2);

btnChooseFile = new Button(shell, SWT.PUSH);
btnChooseFile.setText("..");

final Label lblPath = new Label(shell, SWT.None);
lblPath.setText("存放路径");

txtNewFilePath = new Text(shell, SWT.BORDER);
GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);
txtNewFilePath.setLayoutData(gd3);

btnChoosePath = new Button(shell, SWT.PUSH);
btnChoosePath.setText("..");

final Label lblSize = new Label(shell, SWT.None);
lblSize.setText("分块大小(KB)");

txtFileSize = new Text(shell,SWT.BORDER);
GridData gd7 = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
txtFileSize.setLayoutData(gd7);

btnCut = new Button(shell, SWT.PUSH);
GridData gd4 = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
btnCut.setLayoutData(gd4);
btnCut.setText("开始分割");

final Label lbl1 = new Label(shell, SWT.None);
GridData gd8 = new GridData();
gd8.horizontalSpan = 3;
lbl1.setLayoutData(gd8);
lbl1.setText("待合并的文件列表");

tblFileList = new Table(shell, SWT.BORDER);
GridData gd1 = new GridData(GridData.FILL_BOTH);
gd1.horizontalSpan = 2;
tblFileList.setLayoutData(gd1);

Composite com = new Composite(shell, SWT.None);
GridLayout comLayout = new GridLayout();
com.setLayout(comLayout);

final Label lblNote = new Label(shell, SWT.None);
GridData data = new GridData();
data.horizontalSpan=3;
lblNote.setLayoutData(data);
lblNote.setText("提示:注意合并文件的顺序");

btnUnionFiles = new Button(com, SWT.PUSH);
btnUnionFiles.setText("选择文件");

btnUp = new Button(com, SWT.PUSH);
btnUp.setText(" 上移 ");
btnUp.setEnabled(false);

btnDown = new Button(com, SWT.PUSH);
btnDown.setText(" 下移 ");
btnDown.setEnabled(false);

btnClear = new Button(com, SWT.PUSH);
btnClear.setText(" 删除 ");
btnClear.setEnabled(false);

btnClearAll = new Button(com, SWT.PUSH);
btnClearAll.setText("清空列表");

btnUnion = new Button(com, SWT.PUSH);
btnUnion.setText("开始合并");

btnCut.addSelectionListener(new SelectionAdapter()
//添加"开始分割"监视器

public void widgetSelected(SelectionEvent event)

cutButtonEvent();

);

btnChooseFile.addSelectionListener(new SelectionAdapter()
//添加选择(源文件)监视器

public void widgetSelected(SelectionEvent event)

FileDialog fdOpen = new FileDialog(shell,SWT.OPEN);
String strFileName = fdOpen.open();
if (strFileName != null)

txtSourceFile.setText(strFileName);
txtNewFilePath.setText(fdOpen.getFilterPath());
txtFileSize.setFocus();


);

btnChoosePath.addSelectionListener(new SelectionAdapter()
//添加选择(分割文件存放路径)监视器

public void widgetSelected(SelectionEvent event)

DirectoryDialog dirDia = new DirectoryDialog(shell);
String strFileDir = dirDia.open();
if (strFileDir != null)

txtNewFilePath.setText(strFileDir);
txtFileSize.setFocus();


);

btnUp.addSelectionListener(new SelectionAdapter()
//添加"上移"监视器

public void widgetSelected(SelectionEvent event)

//int[] itemIndices = tblFileList.getSelectionIndices();
int itemIndex = tblFileList.getSelectionIndex();
if (itemIndex == 0)

tblFileList.setFocus();
return;

//交换列表中两行的内容
String strTemp = tblFileList.getItem(itemIndex).getText();
tblFileList.getItem(itemIndex).setText(tblFileList.getItem(
itemIndex - 1).getText());
tblFileList.getItem(itemIndex - 1).setText(strTemp);
//设置焦点
tblFileList.setSelection(itemIndex - 1);
tblFileList.setFocus();

);

btnDown.addSelectionListener(new SelectionAdapter()
//添加"下移"监视器

public void widgetSelected(SelectionEvent event)

//int[] itemIndices = tblFileList.getSelectionIndices();
int itemIndex = tblFileList.getSelectionIndex();
if (itemIndex == tblFileList.getItemCount() - 1)

tblFileList.setFocus();
return;

//交换列表中两行的内容
String strTemp = tblFileList.getItem(itemIndex).getText();
tblFileList.getItem(itemIndex).setText(tblFileList.getItem(
itemIndex + 1).getText());
tblFileList.getItem(itemIndex + 1).setText(strTemp);
//设置焦点
tblFileList.setSelection(itemIndex + 1);
tblFileList.setFocus();

);

btnClear.addSelectionListener(new SelectionAdapter()
//添加"删除"监视器

public void widgetSelected(SelectionEvent event)

int itemIndex = tblFileList.getSelectionIndex();
tblFileList.remove(itemIndex);
btnUp.setEnabled(false);
btnDown.setEnabled(false);
btnClear.setEnabled(false);

);

btnClearAll.addSelectionListener(new SelectionAdapter()
//添加"清空列表"监视器

public void widgetSelected(SelectionEvent event)

tblFileList.removeAll();
btnUp.setEnabled(false);
btnDown.setEnabled(false);
btnClear.setEnabled(false);

);

txtFileSize.addSelectionListener(new SelectionAdapter()
//添加"分块大小"文本框中输入回车监视器

public void widgetDefaultSelected(SelectionEvent event)

cutButtonEvent();

);

btnUnionFiles.addSelectionListener(new SelectionAdapter()
//添加"选择文件"监视器

public void widgetSelected(SelectionEvent event)

FileDialog fd = new FileDialog(shell, SWT.MULTI);
fd.setFilterExtensions(new String[]"*.dat", "*.*");
if (fd.open() != null)

String[] strFiles = fd.getFileNames();
String strFilePath = fd.getFilterPath();
//strUnionFilePath = new String[strFiles.length];
for(int i = 0; i < strFiles.length; i++)

//strUnionFilePath[i] = fd.getFilterPath();
TableItem item = new TableItem(tblFileList, SWT.None);
item.setText(strFilePath + "\\" + strFiles[i]);



);

btnUnion.addSelectionListener(new SelectionAdapter()
//添加"开始合并"监视器

public void widgetSelected(SelectionEvent event)

if (tblFileList.getItemCount() == 0)

return;

switch (unionFiles())

case 1:
showMessage("成功", "合并完成!",
SWT.OK | SWT.ICON_INFORMATION);
tblFileList.removeAll();
btnUp.setEnabled(false);
btnDown.setEnabled(false);
btnClear.setEnabled(false);
break;
case -1:
showMessage("错误", "文件不存在!",
SWT.OK | SWT.ICON_ERROR);
break;
case -2:
break;
default:
showMessage("错误", "有错误发生,文件合并失败!",
SWT.OK | SWT.ICON_ERROR);


);

tblFileList.addSelectionListener(new SelectionAdapter()
//添加选中列表中元素监视器

public void widgetSelected(SelectionEvent event)

btnUp.setEnabled(true);
btnDown.setEnabled(true);
btnClear.setEnabled(true);

);


/**fn_hd
*rem:显示消息框
*log:2005-11-24
*/
private int showMessage(String strText, String strMessage, int i)
/*fn_tl*/
MessageBox msgBox = new MessageBox(shell,i);
msgBox.setText(strText);
msgBox.setMessage(strMessage);
return msgBox.open();


/**fn_hd
*rem:点击"分割"按钮触发的事件响应
*log:2005-11-24
*/
private void cutButtonEvent()
/*fn_tl*/

strSourceFile = txtSourceFile.getText().trim();
strNewFilePath = txtNewFilePath.getText().trim();

if (strSourceFile.equals("") || strNewFilePath.equals(""))

showMessage("提示", "请输入源文件和 \n\n分割文件的路径! ",
SWT.OK | SWT.ICON_INFORMATION);
return;

try

fileSize = Integer.parseInt(txtFileSize.getText());
fileSize *= 1024;
if (fileSize <= 0)

showMessage("错误", "分块大小为正整数! ",
SWT.OK | SWT.ICON_ERROR);
return;


catch(Exception e)

showMessage("错误", "请在分块大小框填入数字! ",
SWT.OK | SWT.ICON_ERROR);
return;

switch (cutFile())

case 1:
showMessage("提示", "分割完成! ", SWT.OK |
SWT.ICON_INFORMATION);
txtSourceFile.setText("");
txtNewFilePath.setText("");
txtFileSize.setText("");
break;
case -1:
showMessage("错误", "源文件不存在或存放路径不存在!",
SWT.OK | SWT.ICON_ERROR);
break;
default:
showMessage("未知错误", "文件分割失败! ",
SWT.OK | SWT.ICON_ERROR);



/*fn_hd
*rem:文件分割实现
*per:成功返回1,文件未找到返回-1,其他情况返回0
*exp:IOException
*aut:
*log:2005-11-22,创建
*log:2005-11-24,修改
*/
private int cutFile()
/*fn_tl*/

sourceFile = new File(strSourceFile);
fileCount = (int) (sourceFile.length() / fileSize);
if (sourceFile.length() % fileSize != 0)

fileCount++;

newFile = new File[fileCount];

try

int count = 0;
int i = 0;
byte[] bueff = new byte[fileSize];
FileOutputStream out = null;
FileInputStream in = new FileInputStream(sourceFile);
for (i = 0; i < newFile.length; i++)

newFile[i] = new File(strNewFilePath,
i + sourceFile.getName() + ".dat");

i = 0;
while ((count = in.read(bueff,0,fileSize)) != -1)

out = new FileOutputStream(newFile[i]);
out.write(bueff,0,count);
out.close();
i++;

in.close();
return 1;

catch(FileNotFoundException e)

System.out.println(e);
return -1;

catch(IOException e)

System.out.println(e);
return 0;



/*fn_hd
*rem:文件合并的实现
*per:成功返回1,文件未找到返回-1,取消操作返回-2,其他情况返回0;
*aut:
*exp:FileNotFoundException,IOException
*log:2005-11-28,创建
*/
private int unionFiles()
/*fn_tl*/

String[] strFiles = new String[tblFileList.getItemCount()];
File[] unionFiles = new File[strFiles.length];
FileDialog fdSave = new FileDialog(shell, SWT.SAVE);
String s = fdSave.open();
if (s == null)

return -2;

File outFile = new File(fdSave.getFilterPath(),
fdSave.getFileName());
if (outFile.exists())

int msg = showMessage("提示", "该文件以存在,是否替换?",
SWT.YES | SWT.NO | SWT.ICON_QUESTION);
if (msg == SWT.NO)

return -2;


for(int i = 0; i < strFiles.length; i++)

strFiles[i] = tblFileList.getItem(i).getText();

try

FileInputStream in = null;
FileOutputStream out = new FileOutputStream(outFile);
byte[] buff = new byte[1024];
int count;
for(int i = 0; i < strFiles.length; i++)

in = new FileInputStream(strFiles[i]);
while((count = in.read(buff,0,1024)) != -1)

out.write(buff,0,count);

in.close();

out.close();
return 1;

catch(FileNotFoundException e)

System.out.println(e);
return -1;

catch(IOException e)

System.out.println(e);
return 0;



参考技术A 是用标准C++实现还是可以利用Framework?
基本原理就是读到文件流里,再一块一块读出写到新文件里。
我这里有一份BCB的源码,翻译成标准C++或VC的CFile实现也不难,需要的话说一声即可
参考技术B 分割就行了?

不要压缩?
参考技术C winRAR就行 别告诉我你不知道这个软件~

以上是关于谁知道c++的好处?的主要内容,如果未能解决你的问题,请参考以下文章

谁知道 文件分割合并工具的 C++源码啊?

谁知道ws2812的一些参数啊,听说阶新科技也有做这块?谁能解答一下

C++:字符串流有啥好处?

C++中类成员函数相互调用有啥好处?

C++中为啥要动态创建对象,有啥好处

EventBus 知识点总结