csv文件的妙用

CSV全称 Comma Separated values,是一种用来存储数据的纯文本
文件格式,通常用于电子表格或数据库软件。有简单易用,占用存储字节少的特点。

规则

0 开头是不留空,以行为单位。
1 可含或不含列名,含列名则居文件第一行。
2 一行数据不垮行,无空行。
3 以半角符号(ASCII),作分隔符,列为空也要表达其存在。
4 列内容如存在,,则用“”包含起来。
5 列内容如存在“”则用“”“”包含。
6 文件读写时引号,逗号操作规则互逆。
7 内码格式不限,可为ASCII、Unicode或者其他。

posted @ 2007-07-04 14:45 bo 阅读(2074) | 评论 (0)编辑 收藏

泛型程序设计是C++的发展方向或者是出路吗?

 

最近看了《C++设计新思维》一书的前几章,总的感觉是不怎么爽。比起以前看《泛型编程 and STL》,boost库起来,感觉该书描述的东西太过于注重模板的技巧,C++是一个编译型的语言,一些动态语言很容易实现的功能C++实现起来就很难,我们完全没有必要硬是用大量的模板来强迫C++在编译期实现这些动态特性。语言只要是好用就行,而现在C++代码里几乎全是模板,并且越来越复杂,不知道以后谁还愿意这样写C++?难道泛型编程就是C++的发展方向吗?

posted @ 2007-05-04 14:03 bo 阅读(3140) | 评论 (5)编辑 收藏

WebSite不能发布在含有中文的目录下?

今天把网站发布在含中文的路径下,结果访问的时候出现了问题,浏览的时候会出现错误提示:您试图在此 Web 服务器上访问的 Web 应用程序当前不可用。请点击 Web 浏览器中的“刷新”按钮重试您的请求。 管理员注意事项: 详述此特定请求失败原因的错误信息可在 Web 服务器的系统事件日志中找到。请检查此日志项以查明导致该错误发生的原因。
后来改到英文目录下就可以了。
难道WebSite不能发布在中文目录下?

 

posted @ 2007-04-04 16:49 bo 阅读(945) | 评论 (0)编辑 收藏

转载:Sizeof与Strlen的区别与联系

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() );

posted @ 2006-10-06 10:40 bo 阅读(18285) | 评论 (3)编辑 收藏

利用信号量机制来完成 防止一个程序被多次运行 的代码

#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;
}

posted @ 2006-08-30 20:48 bo 阅读(1389) | 评论 (1)编辑 收藏

MFC Serialize

一个类要支持Serializable,必须遵循以下步骤:
1。该类必须要继承自CObject
2。在该类的头文件中添加DECLARE_SERIAL宏
3。在该类的实现文件中添加 IMPLEMENT SERIAL宏
4。为该类添加一个缺省构造函数
5。在该类中重写Serialize( CArchive& ar )函数
之后,该类就可以被Serializable。

posted @ 2006-08-28 19:21 bo 阅读(2353) | 评论 (0)编辑 收藏

MFC Message定制步骤

例如COMMAND消息:
1。在该类头文件中添加函数原形声明:afx_msg void OnAppAbout();
2。在该类实现文件中添加宏ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
其中ID_APP_ABOUT为菜单项的ID,在Resource.h中定义为整数(可以系统自动定义,也可以手动定义)
3。在该类实现文件中添加消息实现函数void CTtApp::OnAppAbout()
注:其他类型的消息定制方法类似。

posted @ 2006-08-28 19:15 bo 阅读(778) | 评论 (0)编辑 收藏

MFC VS SDK

1.SDK 中的各类句柄被封装在MFC中的各类对象中了,注意:这里"各类"是对应的,例如CWnd类封装了窗口句柄,CDC类封装了设备句柄。
2.SDK中的函数以::(全局作用域)来标记,例如::MessageBox(...);MFC中则相应的在CWnd类中封装了该函数,名称基本不变MessageBox(...),只是参数不同。
3.所以SDK是基于句柄(各类资源以句柄来标识)和API函数的,而MFC是基于类的,MFC的类封装了SDK中相应的句柄和API函数,所以指向MFC中类的对象的指针就充当了SDK中句柄的功能。

posted @ 2006-08-17 20:48 bo 阅读(1532) | 评论 (0)编辑 收藏

大家看一下这个问题

今天在看一本书附的源代码的时候,发现了一个问题,大家来探讨一下:关于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会帮你关闭?

posted @ 2006-06-10 20:17 bo 阅读(843) | 评论 (3)编辑 收藏

语言的发展方向

我觉得编程语言越来越向专业性发展,语言服务于特定的领域,发展一种适用于很多领域的语言没有很大价值,当某一领域需要某种合适的语言时,会从现有的语言上改动一些,形成一种新的语言,来解决这个领域中的问题。也就是说,语言越来越小,库越来越多,一种语言的公共子集加上一种合适的库就形成了一种新的语言。我觉得这是以后语言的发展方向。
语言只是一门工具,是用来解决某一领域内问题的工具而已,面向问题时,分析,建模,选取合适的语言编码,这都是解决问题的工具。所以,不要为了学习语言而学习语言,应该根据你所面临的问题而学习,选择语言,一般来说,不同适用范围或者适用领域的语言没有优劣之分。

posted @ 2006-04-27 20:14 bo 阅读(857) | 评论 (1)编辑 收藏

仅列出标题
共3页: 1 2 3 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(4)

随笔分类(23)

随笔档案(23)

URL

最新随笔

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜