《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) |