Chinaunix首页 | 论坛 | 博客
  • 博客访问: 860597
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 205
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-23 12:19
个人简介

真挚、可靠、宽厚、大度。

文章分类

全部博文(9)

文章存档

2013年(8)

2011年(1)

我的朋友

分类: C/C++

2013-07-29 13:11:44


《C陷阱与缺陷》中第3章
 实现:将长度无规律的输入数据送到缓冲区(即一块可以容纳N个字符的内存)中去,每当这块内存被填满时,就将缓冲中的内容写出。

 实现环境:
IDE:VC6.0
Handware:PC
System:windowsXP
// cbuffercopy.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "string.h"
#include "windows.h"


#define BUFFERMAX   10
/************************************************************************/
/*
作者:peter
函数名称:flushbuffer
函数功能:将内存中的字符输出
*/
/************************************************************************/ 


void flushbuffer(char *ptr, int n)
{
    char tembuff[BUFFERMAX + 1];
    memset(tembuff, 0, sizeof(tembuff));
    memcpy(tembuff, ptr, n);
    tembuff[n] = '\0';


    printf("buf:%s\n", tembuff);
}


/************************************************************************/
/*
作者:peter
函数名称:bufwrite
函数功能:将长度无规律的输入数据送到缓冲区(即一块可以容纳N个字符的内存)中去,每当这块内存被填满时,就将缓冲中的内容写出。
*/
/************************************************************************/ 
/* 实现一:直接进行内存拷贝 */
void bufwrite1(char *p, int n)
{
    int N = BUFFERMAX;
    char buffer[BUFFERMAX];
    char *bufptr = buffer;
    memset(buffer, 0, sizeof(buffer));

    while(--n >= 0)
    {
        if (bufptr == &buffer[N])/* 注意数组的边界,N可以用于判定边界,但不能赋值 */
        {
          flushbuffer(buffer, N);
          bufptr = buffer;
        }
        *bufptr++ = *p++;
    }
    flushbuffer(buffer, bufptr - buffer); /* 利用指针的减法可以计算数组中有值的部分的个数 */
}


/* 实现二:利用memcpy进行优化 */
void bufwrite2(char *p, int n)
{
    int N = BUFFERMAX;
    char buffer[BUFFERMAX];
    char *bufptr = buffer;


    int rem = 0;
    int k = 0;
    memset(buffer, 0, sizeof(buffer));

    while(n > 0)
    {
        if (bufptr == &buffer[N])/* 注意数组的边界,N可以用于判定边界,但不能赋值 */
        {
            flushbuffer(buffer, N);
            bufptr = buffer;
        }
        rem = N - (bufptr - buffer);
        k = rem > n ? n : rem;
        memcpy(buffer, p, k);
        bufptr += k;
        p += k;
        n -= k;


    }
    flushbuffer(buffer, bufptr - buffer); /* 利用指针的减法( bufptr - buffer)可以计算数组中有值的部分的个数 */
}




int main(int argc, char* argv[])
{
char mainfuf[10*BUFFERMAX];
int counterstart = 0;
int counterend  = 0;


printf("please put in less than %d characters!\n", 10*BUFFERMAX);
gets(mainfuf);

counterstart = GetTickCount();
bufwrite1(mainfuf, strlen(mainfuf));
counterend  = GetTickCount();
printf("bufwrite1 use %d ticks!\n", counterend - counterstart);


counterstart = GetTickCount();
bufwrite2(mainfuf, strlen(mainfuf));
counterend  = GetTickCount();
printf("bufwrite2 use %d ticks!\n", counterend - counterstart);


Sleep(10000);
return 0;
}


阅读(85654) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~