2007年7月4日
CSV全称 Comma Separated values,是一种用来存储数据的纯文本
文件格式,通常用于电子表格或数据库软件。有简单易用,占用存储字节少的特点。
规则
0 开头是不留空,以行为单位。
1 可含或不含列名,含列名则居文件第一行。
2 一行数据不垮行,无空行。
3 以半角符号(ASCII),作分隔符,列为空也要表达其存在。
4 列内容如存在,,则用“”包含起来。
5 列内容如存在“”则用“”“”包含。
6 文件读写时引号,逗号操作规则互逆。
7 内码格式不限,可为ASCII、Unicode或者其他。
2007年5月4日
最近看了《C++设计新思维》一书的前几章,总的感觉是不怎么爽。比起以前看《泛型编程 and STL》,boost库起来,感觉该书描述的东西太过于注重模板的技巧,C++是一个编译型的语言,一些动态语言很容易实现的功能C++实现起来就很难,我们完全没有必要硬是用大量的模板来强迫C++在编译期实现这些动态特性。语言只要是好用就行,而现在C++代码里几乎全是模板,并且越来越复杂,不知道以后谁还愿意这样写C++?难道泛型编程就是C++的发展方向吗?
2007年4月4日
今天把网站发布在含中文的路径下,结果访问的时候出现了问题,浏览的时候会出现错误提示:您试图在此 Web 服务器上访问的 Web 应用程序当前不可用。请点击 Web 浏览器中的“刷新”按钮重试您的请求。 管理员注意事项: 详述此特定请求失败原因的错误信息可在 Web 服务器的系统事件日志中找到。请检查此日志项以查明导致该错误发生的原因。
后来改到英文目录下就可以了。
难道WebSite不能发布在中文目录下?
2006年10月6日
strlen与sizeof的区别
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
5.大部分编译程序在编译的时候就把sizeof计算过了 是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
char str[20]="0123456789";//str是编译期大小已经固定的数组
int a=strlen(str); //a=10;//strlen()在运行起确定
int b=sizeof(str); //而b=20;//sizeof()在编译期确定
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
char c;
sizeof c;//变量名可以不加括弧
8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,
当适用一静态地空间数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸
9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,
如:
fun(char [8])
fun(char [])
都等价于 fun(char *)
在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小
如果想在函数内知道数组的大小, 需要这样做:
进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}
我们能常在用到 sizeof 和 strlen 的时候,通常是计算字符串数组的长度
看了上面的详细解释,发现两者的使用还是有区别的,从这个例子可以看得很清楚:
har str[11]="0123456789";//注意这里str大小因该大于等于11,应考虑'\0'在内,否则编译器会报错
int a=strlen(str); //a=10; >>>> strlen 计算字符串的长度,以结束符 0x00 为字符串结束。
int b=sizeof(str); //而b=11; >>>> sizeof 计算的则是分配的数组 str[11] 所占的内存空间的大小,不受里面存储的内容改变。
上面是对静态数组处理的结果,如果是对指针,结果就不一样了
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针,sizeof 获得的是一个指针的之所占的空间,应该是长整型的,所以是4
sizeof(*ss) 结果 1 ===》*ss是第一个字符 其实就是获得了字符串的第一位'0' 所占的内存空间,是char类型的,占了 1 位strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则一定要使用 strlen
另外,下面的方法可以用于确定该静态数组可以容纳元素的个数:
int a[3]={1,2,3};
cout << sizeof a/sizeof ( typeid( a[0] ).name() );
2006年8月30日
#include "windows.h"
#include <iostream.h>
int main(int argc, char* argv[])
{
HANDLE hMutex=CreateMutex(NULL,TRUE,"test");
if (hMutex)
{
if (ERROR_ALREADY_EXISTS==GetLastError())
{
MessageBox(NULL,"already running","",MB_OK);
return 0;
}
}
while (1)
{
}
return 0;
}
2006年8月28日
一个类要支持Serializable,必须遵循以下步骤:
1。该类必须要继承自CObject
2。在该类的头文件中添加DECLARE_SERIAL宏
3。在该类的实现文件中添加 IMPLEMENT SERIAL宏
4。为该类添加一个缺省构造函数
5。在该类中重写Serialize( CArchive& ar )函数
之后,该类就可以被Serializable。
例如COMMAND消息:
1。在该类头文件中添加函数原形声明:afx_msg void OnAppAbout();
2。在该类实现文件中添加宏ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
其中ID_APP_ABOUT为菜单项的ID,在Resource.h中定义为整数(可以系统自动定义,也可以手动定义)
3。在该类实现文件中添加消息实现函数void CTtApp::OnAppAbout()
注:其他类型的消息定制方法类似。
2006年8月17日
1.SDK 中的各类句柄被封装在MFC中的各类对象中了,注意:这里"各类"是对应的,例如CWnd类封装了窗口句柄,CDC类封装了设备句柄。
2.SDK中的函数以::(全局作用域)来标记,例如::MessageBox(...);MFC中则相应的在CWnd类中封装了该函数,名称基本不变MessageBox(...),只是参数不同。
3.所以SDK是基于句柄(各类资源以句柄来标识)和API函数的,而MFC是基于类的,MFC的类封装了SDK中相应的句柄和API函数,所以指向MFC中类的对象的指针就充当了SDK中句柄的功能。
2006年6月10日
今天在看一本书附的源代码的时候,发现了一个问题,大家来探讨一下:关于Winsock的
下面是两个程序,一个是服务器端的程序,不断在监客户端的连接
另外一个是客户端的程序,试图连接服务器端
服务器端的程序代码:
int main()
{
// 创建套节字
SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sListen == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}
// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定这个套节字到一个本地地址
if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind() \n");
return 0;
}
// 进入监听模式
if(::listen(sListen, 2) == SOCKET_ERROR)
{
printf("Failed listen() \n");
return 0;
}
// 循环接受客户的连接请求
sockaddr_in remoteAddr;
int nAddrLen = sizeof(remoteAddr);
SOCKET sClient;
char szText[] = " TCP Server Demo! \r\n";
while(TRUE)
{
// 接受一个新连接
sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
if(sClient == INVALID_SOCKET)
{
printf("Failed accept()");
continue;
}
printf(" 接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));
// 向客户端发送数据
::send(sClient, szText, strlen(szText), 0);
// 关闭同客户端的连接
::closesocket(sClient);
}
// 关闭监听套节字
::closesocket(sListen);
::MessageBox(NULL,"","",MB_OK);
return 0;
}
大家请注意上面的while循环,在不断监听客户端的连接。除非你手动关闭该服务器程序,否则while循环是不会退出的。那么,问题是:关闭套接字的那段代码始终不会执行(我用MessageBox做了试验,即使是手动关闭该程序,也不会MessageBox),这样,是不是会发生资源泄露呢?难道windows会帮你关闭?
2006年4月27日
我觉得编程语言越来越向专业性发展,语言服务于特定的领域,发展一种适用于很多领域的语言没有很大价值,当某一领域需要某种合适的语言时,会从现有的语言上改动一些,形成一种新的语言,来解决这个领域中的问题。也就是说,语言越来越小,库越来越多,一种语言的公共子集加上一种合适的库就形成了一种新的语言。我觉得这是以后语言的发展方向。
语言只是一门工具,是用来解决某一领域内问题的工具而已,面向问题时,分析,建模,选取合适的语言编码,这都是解决问题的工具。所以,不要为了学习语言而学习语言,应该根据你所面临的问题而学习,选择语言,一般来说,不同适用范围或者适用领域的语言没有优劣之分。