C/C++
文章平均质量分 59
yangluoning
这个作者很懒,什么都没留下…
展开
-
C++线程安全的单例模式实现
Mutex取绝于平台。。。注意:两次instance == null的判断不可少。才能保证多线程安全,这种方法也叫Double-Check Locking(双重锁定)原创 2015-01-10 16:31:11 · 1186 阅读 · 0 评论 -
VS2010控制台程序运行一闪而过的完美解决办法
在VS2010里的控制台应用程序在运行时,结果画面一闪而过,不管是用F5 还是用Ctrl + F5都是一样,导致无法看到结果。 网上有不少的办法,说是都是在程序最后加一个要程序暂停的语句或从控制台上获取用户输入的语句。其实还有一个更好的解决办法: 在你的项目条目(project)上右击鼠标,在弹出菜单上选择最后一项“property/属性”,在左边的一栏里找到“配置属性转载 2013-11-25 09:39:01 · 996 阅读 · 0 评论 -
四种方法实现VC枚举系统当前进程
在Windows 2000以上的MS操作系统,通过Windows的任务管理器可以列出当前系统的所有活动进程(如图1所示),在Windows XP中,更是在控制台下增加了一条Tasklist命令,让系统下的所有进程无所遁行(如图2所示)。这一切是怎么实现的呢? 图 1 图 2引用侯捷大师在《深入浅出MFC》的一句话,“知其然而不知其所以然,真不转载 2013-11-09 15:50:54 · 3927 阅读 · 0 评论 -
整数转化成字符串; 字符串转换为整数
/*整数转化成字符串*/char *IntToStr(int num, char str[]){ int i = 0, j = 0; char temp[100]; while(num) { temp[i] = num % 10 + '0'; //取模运算得到从后往前的每一个数字变成字符 num = num / 10; i++; } temp[i] = 0;原创 2013-11-20 16:48:27 · 850 阅读 · 0 评论 -
简单的 二进制输出
include#includevoid main(){ int i = 31; char s[10]; itoa(i, s, 2); //转换成字符串,进制基数为2 printf("%s",s); //输出}/*itoa是广泛应用的非标准C语言扩展函数。由于它不是标准C语言函数,所以不能在所有的编译器原创 2013-11-06 14:26:38 · 655 阅读 · 0 评论 -
GetSystemTime和GetLocalTime的区别
GetSystemTime获得的时间是基于通用协调时(UTC, Universal Time Coordinated)。GetLocalTime获得的时间是基于本地时间的。如GetLocalTime获得的本地主机的时间是上午8时,当用GetSystemTime获取时,该时间是0时,注意这两个函数的区别!原创 2013-10-23 15:32:16 · 3922 阅读 · 1 评论 -
WIN32编程经验总结
一 窗口和消息1 前缀前缀 全称 释义 CS class style 类风格选项 CW create windows 创建窗口选项 DT draw text 绘制文本选项 IDI Icon ID 图标ID号 IDC Cursor ID 光标ID号 MB Message Box 消转载 2013-10-28 10:37:06 · 1410 阅读 · 0 评论 -
assert()用法总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include assert.h>void assert( int expression ); assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单bad转载 2013-10-24 09:36:46 · 641 阅读 · 0 评论 -
读取当前路径下的.C文件,然后逆序输出文件名
#include "stdio.h"#include "string.h"#include "stdlib.h"#include "windows.h"typedef struct { unsigned int nFileNum; unsigned char aFileNum[3];}tagFile;int main(){ char szPath[MAX_PATH]={0}原创 2013-10-18 16:05:53 · 1766 阅读 · 0 评论 -
Windows 文件、目录操作编程常用API
1、文件操作函数:CreateFile //创建或打开文件;WriteFile //写数据到文件;ReadFile //从文件读数据;CopyFile //拷贝文件;MoveFile //移动或重命名文件;DeleteFile //删除文件;GetModuleFileName //获取文件目录;SetFilePointer //文件指针位置设置;CloseHan原创 2013-10-17 14:44:48 · 585 阅读 · 0 评论 -
WM_CHAR和WM_KEYDOWM的区别
ASCII码不是仅包含字符,还包含很多控制符键盘上大部分的按键都是与ASCII相对应的,包括空格回车ESC等(ESC按键对应ASCII十进制为27)WM_CHAR消息只响应字符按键和部分控制符,有很多控制字符不响应不响应的键如下:Tab键///CapsLock大小写切换键//ESC键///F1~F12///SHIFT///CTRL///ALT///方向键///方向键上方键盘区///转载 2013-10-14 09:33:51 · 3891 阅读 · 0 评论 -
C语言中float,double等类型,在内存中的结构
从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更 高的精度。 任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2 字节)的short int型变量的值是1000转载 2013-09-27 17:08:21 · 782 阅读 · 0 评论 -
WIN32 API编程,wParam lParam参数小结
1.WM_LBUTTONDOWN:产生单击鼠标左键的消息:1Param低字节包含当前光标的X坐标值;高字节包含当前光标的Y坐标值wParam包含一整数值以标识鼠标键的按下状态MK_LBUTTON 按下鼠标左键MK_MBUTTON 按下鼠标中键MK_RBUTTON 按下鼠标右键此外,相似的消息还有:lWM_LBUTTONU原创 2013-10-12 17:03:33 · 2408 阅读 · 0 评论 -
(x&y) + ( (x^y)>>1 )证明
对于位运算求两个数的平均值问题,(整形数据)int average(int x,int y){return ( (x&y) + ( (x^y)>>1 ) );}给出两个整数,求出结果。刚开始看到这道题的做法就是x和y转换为二进制,然后计算出结果。在没有办法的情况下这样做也可以得出结果。跟你想象的一点不差,这里确实有捷径。原创 2013-09-23 16:24:27 · 540 阅读 · 0 评论 -
整数 向上取整算法:(x+n-1)/n
Floor表示向下取整 Ceiling表示向上取整/* 1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor, * 例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢? * 例如x是17,n是4,则结果是5;x是16,n是4,则结果是4。 */向上取整算法:(x+n-1)/n解析:(1)当x/n正好除尽时,(原创 2013-09-30 11:29:59 · 6875 阅读 · 0 评论 -
匈牙利命名法的衰落和建议
首先要说明的是,此文只是一篇关于个人看法的随笔,不是paper。我也无意再次挑起这场旷日持久却已结束的争论。1.不太久远的历史匈牙利命名法(Hungarian Notation)最初雏形来自Charles Simonyi的一篇论文,后来Charles Simonyi进入Microsoft并担任Microsoft Office开发的要职后得到完善,并在M$内部得到推广转载 2013-09-13 09:28:57 · 9165 阅读 · 1 评论 -
my_dtoa函数
int my_dtoa(double d, char dlen, char* buf, char clen){#define ARRLEN 10 char m_arr[]={'0','1','2','3','4','5','6','7','8','9'}; char tmpArr[ARRLEN]={0}; char* ptmp=tmpArr; int nZS=0; double原创 2013-08-12 11:18:52 · 1335 阅读 · 0 评论 -
统计文本中单词数
/////////统计文本中单词数(以 空格 和 回车 分隔)///////////////int CountWords(char* filename){ int ret=0; ifstream fin(filename); if (!fin) { cout<<"打开文件失败!"<<endl; return 0; } string oneline; string wor原创 2013-11-28 14:57:10 · 842 阅读 · 0 评论 -
WIN32菜单基本操作
HMENU MainMenu=CreateMenu();HMENU PopMenu1=CreatePopupMenu();AppendMenu(PopMenu1,MF_STRING,1001,"打开");AppendMenu(PopMenu1,MF_STRING,1002,"保存");AppendMenu(PopMenu1,MF_SEPARATOR,0,NULL);AppendMenu(原创 2013-11-30 10:23:00 · 1748 阅读 · 0 评论 -
VIM命令小抄
Vim 命令小抄original card by Laurent Gregoires redesign by brohan基本移动插入模式撤消,重做h l j k左/右 移动一个字符;上/下 移动一行^Vc ^Vn插入字符 c 的本义/十进制值 n转载 2013-12-07 16:01:06 · 1821 阅读 · 0 评论 -
统计文件内容行数
#include "windows.h"#include "iostream"#include "fstream"#include "string"#include #include "time.h"using namespace std;long long gFileCnt = 0;long long gFilesLine = 0;const char* gFileExN原创 2014-09-03 14:40:51 · 913 阅读 · 0 评论 -
动态创建
#ifndef _DYN_CREATE_H_#define _DYN_CREATE_H_using namespace std;#include "map"#include typedef void* (*FUNC)(void);class DynamicCreateObj{public:static void* CreateObject(con原创 2014-08-16 15:22:57 · 626 阅读 · 0 评论 -
sizeof举例,这回全了
#include "iostream"using namespace std;#pragma pack(4)/* 4字节对齐 (1) struct{ short a; short b; short c;}A; sizeof(A) = 6 (2) struct { long a; short b;}A; sizeof(A) = 8 (3) struct A{ short a;原创 2014-08-14 13:35:01 · 896 阅读 · 0 评论 -
MFC任务栏操作
获得桌面窗口转载 2014-08-21 18:11:10 · 1966 阅读 · 0 评论 -
很幽默的讲解六种Socket I/O模型
本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教。一:select模型二:WSAAsyncSelect模型三:WSAEventSelect模型四:Overlapped I/O 事件通知模型五:Overlapped I/O 完成例程模型六:IOCP模型老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件转载 2014-07-23 11:29:39 · 616 阅读 · 0 评论 -
记录几个开平方算法
整数开平方算法:本算法只采用移位、加减法、判断和循环实现,因为它不需要浮点运算,也不需要乘除运算,因此可以很方便地运用到各种芯片上去。我们先来看看10进制下是如何手工计算开方的。先看下面两个算式,x = 10*p + q (1)公式(1)左右平方之后得:x^2 = 100*p^2 + 20pq + q^2 (2)现在假设我们知道x^2和p,希望求出q来,求转载 2014-06-11 16:09:03 · 799 阅读 · 0 评论 -
几种经典的网络服务器架构模型的分析与比较
前言事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在高连接 数高吞吐量的服务器程序中,如 http 服务器程序、ftp 服务器程序等。相比于传统的网络编程方式,事件驱动能够极大的降低资源占用,增大服务接待能力,并提高网络传输效率。关于本文提及的服务器模型,搜索网络可以查阅到很多的实现代码,所以,本文转载 2014-01-21 10:48:09 · 497 阅读 · 0 评论 -
C++输入cin详解
输入原理:程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入#1:#include using namespace std;int main(){转载 2014-01-20 11:52:11 · 618 阅读 · 0 评论 -
共享内存
与虚拟内存相似,内存映射文件保留了一个地址空间区域,在需要时将它提交到物理存储器。它们之间的不同点是内存映射文件提交到物理存储器的数据来自磁盘上相应的文件,而不是系统页文件。一旦文件被映射,就可以认为整个文件被加载到了内存中,可以像访问内存一样访问文件的内容。 使用内存映射文件的目的有3 个: (1 )系统使用内存映射文件来加载和执行.EXE 和DLL 文件。这极大的节省了系统页文原创 2014-01-25 10:58:00 · 866 阅读 · 0 评论 -
C++中Overload、Overwrite和Override区别
Overload、Overwrite和Override的概念比较容易混淆,而且Overwrite和Override的中文翻译五花八门,让人很Confuse,顾保持英文原意:Overload 重载在C++程序中,可以将语义、功能相似的几个函数用同一个名字表示,但参数不同(包括类型、顺序不同),即函数重载。(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不转载 2014-01-22 11:50:26 · 867 阅读 · 0 评论 -
枚举当前系统进程的一种方法
#include "windows.h"#include "tlhelp32.h"#include "iostream"using namespace std;BOOL TerminateProcessFromID(DWORD ProcessID){ BOOL bRet = FALSE; HANDLE hProcess = OpenProcess(PROCESS_ALL_ACC原创 2014-01-14 10:56:02 · 577 阅读 · 0 评论 -
socket编程之select()
socket编程之select() Select在Socket编程中还是比较重要的,它能够监视我们需要监视的文件描述符的变化情况——读写或是异常。 Select的函数格式(Unix系统下的伯克利socket编程,和windows下的略有区别,体现两个方面:一是select函数的第一个参数,在windows下可以忽略,但在linux下必须设为最大文件描述符加1;二是结构fd转载 2014-01-21 11:51:20 · 573 阅读 · 0 评论 -
VC资源分配、释放表
资源分配函数清除函数需要手动清除AcceleratorsLoadAcceleratorsN/ANoAtomsGlobalAddAtomGlobalFreeAtomYesBitmapsCreateBitmapD转载 2013-12-17 16:12:40 · 868 阅读 · 0 评论 -
CString类的完美总结
①、CString 类对象的初始化:CString str;CString str1(_T("abc"));CString str2 = _T("defg"); TCHAR szBuf[] = _T("kkk");CString str3(szBuf);CString str4 = szBuf; TCHAR *p = _T("转载 2013-12-30 14:07:27 · 604 阅读 · 0 评论 -
WIN32读写INI文件方法
概述在程序中经常要用到设置或者其他少量数据的存盘,以便程序在下一次执行的时候可以使用,比如说保存本次程序执行时窗口的位置、大小、一些用户设置的 数据等等,在 Dos 下编程的时候,我们一般自己产生一个文件,由自己把这些数据写到文件中,然后在下一次执行的时候再读出来使用。在 Win32 编程中当然你也可以这样干,但 Windows 已经为我们提供了两种方便的办法,那就是使用注册表或者 i原创 2013-12-30 12:11:42 · 6639 阅读 · 0 评论 -
CString 成员函数用法大全
CString( );例:CString csStr;CString( const CString& stringSrc );例:CString csStr("ABCDEF中文123456"); CString csStr2(csStr);CString( TCHAR ch, int nRepeat = 1 );例:CString csStr('a',5);转载 2013-12-09 16:15:55 · 537 阅读 · 0 评论 -
draw_3d_rect
void FillSolidRect(HDC hdc, int x, int y, int cx, int cy, COLORREF clr){ RECT rect; SetBkColor(hdc, clr); rect.left = x; rect.top = y; rect.right = x + cx; rect.bottom = y + cy;原创 2013-09-12 13:53:09 · 649 阅读 · 0 评论 -
const用法小结
1. 定义const常量:在定义一个const常量时必须赋以初值,而且之后不能更改。定义格式:(1) const 类型名 变量名 =常量或者常量表达式; (2) 类型名 const 变量名 = 常量或者常量表达式;如: const int iVal = 8; iVal= 10;//错误,不允许更改 2. const引用:指向const对象的原创 2013-08-29 13:47:59 · 1080 阅读 · 0 评论 -
my_atof()函数
#include #include float my_pow(float base,int n){ float ret=1.0; while (n--) { ret*=base; } return ret; }//成功返回0,错误返回-1,parr必须以\0结尾int my_atof(char* parr,float* pf){ char *ptmp=parr原创 2013-08-23 17:53:16 · 1076 阅读 · 0 评论 -
strscr() strlen() strcpy()实现
/* strchr *//* 该函数用来查找一个字符串中某个字符第一次出现的位置 *//* 如果找到:返回绝对地址. 没有找到:返回NULL */char* /* 返回字符串第一次出现的绝对位置 */my_strchr( const char* src, /* 被查找的字符串 */ char ch /* 需要查找的字符 */ ){翻译 2013-04-03 14:51:07 · 525 阅读 · 0 评论