测量/计算程序运行时间

分类:C/C++C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t。在MSDN中,查得对clock函数定义如下:

clock_t clock( void );

这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock)。其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:

  1. #ifndef _CLOCK_T_DEFINED
  2. typedef long clock_t;
  3. #define _CLOCK_T_DEFINED
  4. #endif

继续阅读 »

fopen和open的具体区别

分类:C/C++1、open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。

2、fopen的实现要调用open, 关键看你想返回什么了, FILE指针还是描述符?

3、32位环境下,编译加“-D_FILE_OFFSET_BITS=64” 要在open里加O_LARGEFILE标记

  1. static int ext2_open_file (struct inode * inode, struct file * filp)
  2. {
  3. if (!(filp->f_flags & O_LARGEFILE) &&
  4.        inode->i_size > 0x7FFFFFFFLL)
  5. return -EFBIG;
  6. return 0;
  7. }

0x7FFFFFFF就是2G-1。 看一下这个逻辑, 就知道open时必须制定O_LARGEFILE.

继续阅读 »

将一个结构体拷贝到字符数组缓冲区,再读出

分类:C/C++

  1. #include <stdio.h> 
  2. #include <memory.h> 
  3.  
  4. typedef struct 
  5. { 
  6. int cmd;
  7. void *param;
  8. }st;
  9.  
  10. char buf[50];
  11.  
  12. int main(int argc, char* argv[]) 
  13. { 
  14. st st1,*st2;
  15. st1.cmd = 1;
  16. st1.param = &st1.cmd;
  17.  
  18. memcpy(buf, &st1, sizeof(st));
  19.  
  20. st2 = (st*)buf;
  21. printf("cmd:%d\n", st2->cmd);
  22. printf("param:%d\n", st2->param);
  23. return 0;
  24. }

Eclipse + CDT + MinGW + MySQL环境搭建解决方案

分类:C/C++环境说明: Windows XP, Eclipse 3.5, MinGW 5.1.4, Mysql 5.1.36, CDT 3.1

在Eclipse下用CDT和MinGW编写C访问Mysql时会出现 undefined reference to `mysql_init@4′的问题,这是因为mingw编译时找不到静态库的原因,网上的解决办法一般是用:reimp.exe及dlltool.exe重新生成libmysql.def和libmysql.a,然后用libmysql.a。具体命令是:

dlltool --input-def libmySQL.def --dllname libmySQL.dll --output-lib libmysql.a -k

奇怪的是用这这个办法生成的libmysql.a为0字节,后来查看有libmysql.lib文件,试着将其改名为libmysql.a,问题得到解决,具体解决步骤如下:

1、添加Mysql头文件:
方法1:项目->属性->C/C++ Build->Tool Settings->GCC C Compiler->Directories 中添加你的头文件所在目录,包括Mysql中的include目录。
方法2:将Mysql中的include目录拷到项目下的头文件目录下或MinGW的公共include目录下,目录改名为mysql。

2、添加用于gcc编译的mysql静态库文件
复制mysql安装目录中的\lib\opt\libmysql.lib为libmysql.a。

另外查询或插入记录时乱码问题的解决:
在mysql连接成功后,发出查询之前,加入如下代码

  1. mysql_set_character_set(&mysql,"gb2312");

如有问题,请发邮件到 cdkey51@linuxany.com ,大家一起探讨。

继续阅读 »

print line help for debug

分类:C/C++The simplest debug technique is to print out a line contains the required variables value. By printing out a line at a suspect bugs point, it helps for debug . With few magic variables, that ease us debug even more.

They are __FUNCTION__, __PRETTY_FUNCTION__, __LINE__, __FILE__ .

__FUNCTION__ will returns a string of the function name where the print line stay.

__PRETTY_FUNCTION__ will only recognized by gcc compiler, that returns function name with indication the function is from which class.

__FILE__ returns which source code filename.

__LINE__ returns the exact line of the print line.

继续阅读 »

sprintf()的一些高级用法

分类:C/C++在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直 接在命令行上输出。这也导致sprintf 比printf 有用得多。

sprintf 是个变参函数,定义如下:

  1. int sprintf( char *buffer, const char *format [, argument] ... );

除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:
格式化字符串上。

printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。

继续阅读 »

C中的文件操作

分类:C/C++文件使用方式        意 义
“rt”      只读打开一个文本文件,只允许读数据
“wt”      只写打开或建立一个文本文件,只允许写数据
“at”      追加打开一个文本文件,并在文件末尾写数据
“rb”      只读打开一个二进制文件,只允许读数据
“wb”       只写打开或建立一个二进制文件,只允许写数据
“ab”       追加打开一个二进制文件,并在文件末尾写数据
“rt+”      读写打开一个文本文件,允许读和写
“wt+”      读写打开或建立一个文本文件,允许读写
“at+”      读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+”      读写打开一个二进制文件,允许读和写
“wb+”      读写打开或建立一个二进制文件,允许读和写
“ab+”      读写打开一个二进制文件,允许读,或在文件末追加数据
继续阅读 »


返回顶部