- 博客(45)
- 资源 (4)
- 收藏
- 关注
原创 Python读取Word(.docx)正文信息
Python读取Word(.docx)正文信息本文介绍用Python简单读取*.docx文件信息,一些python-word库就是对这种方法的扩展。介绍分两部分:Word(*.docx)文件简述Python提取Word信息Word(*.docx)文件简述大约在2008年以前,Office产品中Word用.doc文件格式,这种二进制格式很难与其他软件兼容。 为了跟上时代,微软采用类XML格式标
2017-08-05 21:53:59
12364
8
原创 如何批量实现通过MP3标题重命名文件名
如何批量实现通过MP3标题重命名文件名本文介绍对MP3格式进行重命名操作,首先通过文件属性获取MP3文件标题Title,然后用标题对文件名进行重命名。方法通过C#实现,共分两步:1通过ShellClass获得文件属性2以mp3文件的Title属性对其进行重命名
2017-05-18 20:26:31
16462
转载 控制反转(IoC)与依赖注入(DI)
1.控制反转(Inversion of Control)与依赖注入(Dependency Injection)控制反转即IoC (Inversion of Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。IoC是一个很大的概念,可以用不同的方式来实现。
2017-04-07 15:19:35
680
原创 C中可变参数函数及log函数运用
C语言中函数可以定义为可变参数的。看printf的定义:int printf(char *fmt, ...);可变参数的处理需要用到stdarg.h中的一些宏。C语言标准库中头文件stdarg.h包含了一组能够遍历变长参数列表的宏。主要包含下面几个:1、va_list 用来声明一个表示参数表中各个参数的变量。2、va_start 初始
2017-03-21 15:40:09
1334
原创 C#事件——对委托的封装
C#中,正如属性是对成员变量的封装,事件是对委托的封装。完整的事件流程: class Program { static void Main(string[] args) { EventSender sender = new EventSender(); EventRevicer revicer =
2017-03-13 09:17:24
2491
1
原创 为类写一个自己的堆
为什么要创建自己的堆呢?有多方面原因:对组件进行保护更有效的内存管理局部访问避免线程同步开销快速释放在C++中,我们用new操作符来分配类对象,用delete操作符来释放它。通过对C++类的new和delete操作符进行重载,我们可以非常容易地将堆函数加以运用。总体来看,不为每一个类创建堆的唯一优势是不会有额外的性能和内存开销。但是这些性能和内存开销并不大,与潜在的回报
2017-01-21 20:33:30
334
原创 用内存映射文件实现进程间通信
使用内存映射文件的一般流程: 由于内存映射文件的一致性,即系统保证在同一文件映射对象的多个视图间保持一致。这可以作为进程通讯的基础,而且在Windows上,同一台机器上共享数据的最底层机制都是内存映射文件。 许多应用程序会在运行过程中创建一些数据,并需要将这些数据传输给其他进程,或与其他进程共享这些数据。如果为了共享数据而必须让应用程序在磁盘上创建数据文件并把数据保存在文
2017-01-21 18:05:04
3978
1
原创 用内存映射文件来处理大文件
1.使用内存映射文件来处理文件的内容,我们先打开文件并向系统预订一块虚拟地址空间区域。接着让系统把文件的第一个字节映射到该区域的第一个字节。然后就可以访问这块虚拟内存区域,就好像它实际包含了文件一样。2.这种方法的最大的优点在于让系统为我们处理所有与缓存有关的操作。我们不必再分配任何内存,把文件中的数据载入内存,把数据写回文件、以及释放内存块。3.而且我们还可以通过只映射文
2017-01-21 16:40:14
754
原创 程序的多个实例间共享数据
程序比较简单,注释也比较详细,不再做过多说明。#include #include //创建一个共享段Shared,一段变量放在单独的段中,//系统不会再在同一个可执行或DLL的每一个实例中为//它们创建新的实例了#pragma data_seg("Shared")unsigned count=0;#pragma data_seg()//告诉链接器共享这个段中的变量#pra
2017-01-21 11:58:47
1521
原创 用命名内核对象判断程序是否有实例正在运行
命名内核对象可以进程之间共享句柄通过让进程每次运行创建一个命名内核对象,判断创建是否成功用GetLastError()获得错误代码,即可判断程序是否有实例正在运行代码页比较简单,不做过多描述,详情参考《windows核心编程》#include #include int main(){ HANDLE hMutex = CreateMutex( NULL, false, "u
2017-01-21 10:58:26
289
原创 如何通过进程名字关闭系统正在运行的进程
STEP ONE终止正在运行的进程,我们用TerminateProcess()函数,函数原型:BOOL TerminateProcess( HANDLE hProcess, // handle to the process UINT uExitCode // exit code for the process);So,在这儿,我们需要获得需要终止的进程的句柄。
2017-01-14 09:03:51
816
原创 ANSI与UNICODE的相互转换
ANSI与UNICODE的相互转换需要用到可格式化字符串函数:*sprintf 和 *sprintf_S注意:1.sprintf和swprintf由于安全性欠佳,已经被sprintf_s和swprintf_s替代。2.上述代码“%S"中的S为大写,这一般是新手的问题所在。
2017-01-11 16:54:30
2978
转载 VS2013使用技巧汇总
1. Peek View在不新建TAB的情况下快速查看、编辑一个函数的代码。以前要看一个函数的实现,需要在使用的地方点击F12跳转到该函数,实际上这是很浪费时间的。VS2013Peek View便解决了这个问题。在光标移至某个函数下,按下alt+F12。用法:在光标移至某个函数下,按下alt+F12。 可以看出在当前页即有当前函数的实现。然后在Pee
2017-01-08 20:28:09
7423
转载 Linux虚拟地址空间布局以及进程栈和线程栈总结
目录(?)[-]一Linux虚拟地址空间布局1 内核空间2 栈stack3 内存映射段mmap4 堆heap5 BSS段 6 数据段Data 7 代码段text 8 保留区二Linux 中的各种栈进程栈 线程栈 内核栈 中断栈Linux 中有几种栈各种栈的内存位置一进程栈二线程栈三进程内核栈四中断栈Linux 为什么需要区分这些栈
2017-01-06 20:41:33
1453
转载 进程地址空间的一点认识
在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好了解目前操作系统的内存管理机制。一 早期的内存分配机制在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。那当程序同时运行多个程序时,操作系
2017-01-06 15:10:46
1044
1
转载 VS调试:dump定位
在系统中异常或者崩溃的时候,来生成dump文件,然后用调试器来调试,可以快速精确定位崩溃的代码行。这样就可以把生产环境中的dmp文件,拷贝到自己的开发机器上,调试就可以找到错误的位置,配合程序调试符号pdb文件,直接可以定位到源代码中位置,真是太神奇了。1.创建dump文件的三种方法:第一种:通过任务管理器:这种适用在程序挂了(crash)的时候进程还未退出,比如我运行程序
2017-01-05 11:15:30
9848
原创 程序的机器级表示<CSAPP>
1.一个IA32 CPU包含一组8个存储32位值的寄存器。这些寄存器用来存储整数数据和指针。" style="border:0px; max-width:100%; display:block; margin:1em auto">2.操作数指示符,指示出一个操作中药引用的源数据值,以及放在结果的目标位置。源数据可以以常数形式给出,或是寄存器或存储器中读出,结果放在寄存器或存储器中。
2016-12-24 10:33:15
597
转载 HRESULT的详细说明
1. SUCCEEDED原型如下:BOOL SUCCEEDED( HRESULT hr);对应的定义(具体的实现):#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)2. FAILED原型如下:BOOL FAILED( HRESULT hr);对应的定义(具体的实现):#define FAILED(hr) (((HR
2016-12-22 09:38:56
1055
转载 C++对象内存模型
谈VC++对象模型(美)简.格雷程化 译译者前言一个C++程序员,想要进一步提升技术水平的话,应该多了解一些语言的语意细 节。对于使用VC++的程序员来说,还应该了解一些VC++对于C++的诠释。 Inside the C++ Object Model虽然是一本好书,然而,书的篇幅多一些,又和具体的VC++关系小一些。因此,从篇幅和内容来看,译者认为本文是深入理解C+
2016-11-21 14:37:07
4818
2
原创 模式十三:代理模式(Proxy Pattern)——对象的替身
代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问。应用分析使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或者需要安全控制的对象。代理模式为另一个对象提供代表,以便控制客户对对象的访问,管理访问的方式有许多种。远程代理管理客户和远程对象之间的交互。虚拟代理控制访问实例化开销大的对象。保护代理基于调用者控制
2016-10-20 11:03:37
283
原创 模式十二:状态模式(State Pattern)——状态对象切换来改变状态
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。应用分析状态模式将状态封装成独立的类,并将动作委托到代表当前状态的对象。从客户的视角来看,如果使用的对象能够完全改变它的行为,那么就会觉得这个对象实际上是从别的类实例化而来的,然而,实际上,我们是在使用组合通过简单引用不同的状态对象来造成类改变的假象。模式对比以状态模式而言,我们将一群行为封装在状态对
2016-10-20 10:09:00
597
原创 模式十一:组合模式(Composite Pattern)——整体与部分一致化
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。应用分析组合模式让我们能用树形方式创建对象的结构,树里面包含了组合以及个别的对象。使用组合结构,我们能把相同的操作应用在组合和个别对象上。话句话说,在大多数情况下,我们可以忽略对象组合和个人别对象之间的差别。代码分析//Component.h#ifndef C
2016-10-19 17:20:43
300
原创 模式十:迭代器模式(Iterator Pattern)——顺序访问聚合对象元素
迭代器模式提供一种方法顺序访问一个聚合对象中的元素,而不暴露其内部的表示。应用分析迭代器模式让我们能游走于聚合内的每一个元素,而不暴露其内部的表示。把游走的任务放在迭代器上,而不是聚合上。这样简化了聚合的接口和实现,让责任各得其所。C++的STL类库中,每个容器都有自己的迭代器,用于顺序访问容器内的元素,都是通过begin和end函数分别获得首尾迭代器。由于迭代器的实际类型
2016-10-19 17:06:45
530
原创 模式九:模板方法模式(Template Pattern)——封装算法块
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到之类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。应用分析模板方法定义了一个算法的步骤(模板),并允许子类为一个或多个步骤提供实现。模板方法模式的抽象基类提供三类方法:1.模板方法,用于定义算法步骤,不应再子类中改变;2.抽象方法,提供一个接口,用于在子类中实现;3.具体方法,由
2016-10-18 10:43:31
519
原创 模式八:外观模式(Facade Pattern)——简化接口
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。应用分析外观没有“封装”子系统的类,外观只提供简化的接口。所以客户如果觉得有必要,仍可以直接使用子系统的类。外观只是让子系统更方便。一个子系统可以建立多个外观。外观模式也允许将客户从任何子系统中解耦。外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接
2016-10-17 21:28:10
288
原创 模式七:适配器模式(Adapter pattern)——接口转换
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。应用分析主要功能是完成接口转换,通过适配器,将被适配者的接口转换成满足客户需求的接口。客户使用适配器的过程如下:客户通过目标接口调用适配器的方法对适配器发出请求;适配器使用被适配者接口把请求转换成被适配者的一个或多个调用接口;客户接收到调用的结果,但并未察觉这一切是适配器在起转
2016-10-17 21:02:44
308
原创 模式六:命令模式(Command Pattern)——封装请求对象
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。应用分析命令模式的设计,定义公共的Command接口,使请求调用者和请求接收者之间解耦,便于请求扩展。Command:定义命令的统一接口ConcreteCommand:Command接口的实现者,用来执行具体的命令,某些情况下可以直接用来充当Receiver。Rece
2016-10-14 19:12:01
592
原创 模式五:单例模式(Singleton Pattern)——创建独一无二的对象
单例模式确保一个类只有一个实例,并提供一个全局访问点。应用分析还有一些对象其实我们只需要一个,比如说:线程池(threadpool)、缓存(cache)、对话框、处理偏好设置和注册表的对象、日志对象,充当打印机、显卡等设备的驱动程序对象。事实上,这类对象只能有一个实例,如果制造出多个实例,就会导致许多问题产生,例如:程序的行为异常、资源使用过量、或者是不一致的结果。代码分析//
2016-10-12 10:49:13
328
原创 模式四:工厂模式(Factory Pattern)——封装对象的创建
1.简单工厂首先从简单工厂开始吧,简单工厂不是一个设计模式,反而比较像一种编程习惯,使用非常频繁。应用分析对象有一系列接口,但对象的创建可能是需要经常变化的地方,而对象的创建与实际的具体类型相关紧密,因此,我们将对象的创建封装在工厂类中,由它专门负责对象的创建,而且创建对象的方法可以声明为工厂类的静态方法,这样我们在使用对象的过程中,可以根据接口编程,分离了变化部分与不变部分,便于维护
2016-10-11 16:10:59
246
原创 模式三:装饰者模式(Decorator Pattern)——对象的功能扩展
装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供比继承更有弹性的替代方案。应用分析——对象的功能扩展对象的功能扩展,最简单的方式就是继承,但是几种不同的功能有不同的组合时,将会产生许许多多的类,这样不利于管理。采用装饰者模式,让装饰者与实际对象有相同的接口(继承同一抽象类),通过组合或委托的方式引用被装饰对象,然后对被装饰对象进行动态扩展,可以获
2016-10-09 12:43:29
300
原创 模式二:观察者模式(Observer Pattern)——实现一对多关系
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。应用分析——一对多对应关系实现当多个观察者对象需要依赖一个主题对象的状态而动态变化时,使用观察者模式,当主题状态改变时,会通知观察者,观察者收到通知产生相应的状态更新。
2016-10-09 10:11:25
1702
原创 模式一:策略模式(Strategy Pattern)——实现可替换算法
策略模式定义算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。应用分析——变化部分的实现一种类型经常变化的部分,如果放在基类里面,变化的子类需要重新实现,不利于代码重用;如果定义在抽象类里面,通过继承自不同的抽象类,可以获得不同的行为,这也可以实现,通常,继承增加代码之间的耦合度,用组合可以实现松耦合;因此,我们定
2016-10-08 14:30:42
630
1
原创 字符串匹配算法---Brute force、KMP、Sunday
字符串匹配---输入原字符串(String)和子串(又称模式),输出为子串在原字符串中的首次出现的位置。在这儿,我们介绍用于字符串匹配的Brute force、KMP和Sunday方法。1.Brute force该方法又称暴力搜索。匹配时间复杂度O(N*M)主要过程:从原字符串开始搜索,若出现不能匹配,则从下一个位置继续。int bf(const char *t
2016-08-31 18:29:49
534
原创 求字符串中的回文最大长度
目前,此问题最好的解法是Manacher算法,时间复杂度为O(n),本文还给出了另外两种便于理解的方法。1.Manacher算法//Manacher's ALGORITHM: O(n)时间求字符串的最长回文子串 #include #include using namespace std;int Manacher(const string &data, const int &num
2016-08-31 15:49:13
403
原创 判断一个数组中没有出现的最小正数
下面介绍一种判断一个数组中没有出现的最小正数的方法,要保证效率:时间复杂度O(n)空间复杂度O(1)方法思路:使用数组下标,通过交换,保证数组下标为i的元素值为i+1,即arr[i]=i+1,然后从前往后,不满足此条件的数即为所求。实现代码://判断一个数组中没有出现的最小正数//时间复杂度O(n),空间复杂度O(1)#include us
2016-08-30 14:23:08
1623
2
原创 用两个队列实现栈&用两个栈实现队列
栈和队列的相互实现一直是面试中常考的问题。下面是它们的相互实现代码,以方便大家学习交流。用两个队列实现栈/*两个队列实现栈*/#include #include using namespace std;templateclass my_stack{ private: queue q_one; queue q_two; public: int top
2016-08-30 13:12:57
304
原创 字符串和数组经典面试问题总结
数组和字符串是密切相互的。从抽象的意义上说,字符串只是一个(可能是只读的)字符数组。进入正题,这方面的经典面试问题有哪些呢?编写strcpy函数问题描述:编写c语言的strcpy函数,完成字符数组复制功能。代码及分析如下:#include char* str_cpy(char *dis_str,const char *sou_str){ if((!dis_
2016-08-11 19:22:09
472
1
转载 内存对齐规则以及作用
首先由一个程序引入话题: 1 //环境:vc6 + windows sp2 2 //程序1 3 #include 4 5 using namespace std; 6 7 struct st1 8 { 9 char a ;10 int b ;11 short c ;12 };13 14 struct st
2016-08-11 11:59:19
272
原创 算法分析及实例解析(三)——回溯法
回溯法(backtracking)回溯法,是一种系统地搜索问题的方法。8皇后问题分治法有哪些经典例子呢?那可就多了,比较常见的将在下面一一列出分析。子集与数问题分治法有哪些经典例子呢?那可就多了,比较常见的将在下面一一列出分析。0-1背包问题分治法有哪些经典例子呢?那可就多了,比较常见的将在下面一一列出分析。着色问题
2016-08-08 20:52:02
2380
原创 算法分析及实例解析(二)——贪心算法、动态规划
贪心算法(greedy algorithm)贪心算法,顾名思义。其算法描述为:在分步决策问题中,每一步选择当前最优。由于贪心算法仅考虑局部最优性,所以不能保证整体最优。因此,对于贪心算法,必须进一步证明该算法的每一步做出的选择都必然导致问题的一个整体最优解。一般来说适用于贪心算法的问题具有两个特性:最优度量标准和最优子结构。贪心算法每一步做出的选择可以依赖于以前做出的选择,但决
2016-08-08 20:25:01
827
1
Making it Big in Software(远大前程 - 完整引文版 -高清).pdf
2018-10-27
软件调试实战 pdf
2017-01-03
OPC DA服务器与客户程序开发指南 源码下载
2016-11-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人