CStash 的例子

typedef struct CStashTag
{
	int size;
	int quantity;
	int next;
	unsigned char* storage;
}CStash;

void initialize(CStash* s, int size);
int add(CStash* s, const void* element);
void inflate(CStash* s, int increase);
int count(CStash* s);  // 计算CStash里的数据有多少个,
void* fetch(CStash* s, int index);  //取指针里的数,
void cleanup(CStash* s);  // 清除,把分配的内存释放,

#include "Clib.h"
#include <cstdlib>
#include <cassert> // 这个是断言的头文件,

const int increment = 100;

void initialize(CStash* s, int sz)
{
	s->size = sz;
	s->quantity = 0;
	s->next = 0;
	s->storage = 0;
}

int add(CStash* s, const void* element)
{
	if (s->next >= s->quantity)
		inflate(s, increment);
	int startBytes = s->next *s->size;
	unsigned char *e = (unsigned char*)element;
	for (int i = 0; i < s->size; i++)
		s->storage[startBytes + i] = e[i];
	s->next++;
	return (s->next - 1); // 返回的是位置,
}

void inflate(CStash* s, int increase)
{
	assert(increase > 0);
	int newQuantity = s->quantity + increase;
	int newBytes = newQuantity * s->size;
	int oldBytes = s->quantity * s->size;
	unsigned char* b = (unsigned char*)malloc(newBytes);
	for (int i = 0; i < oldBytes; i++)
		b[i] = s->storage[i];
	free(s->storage);
	s->storage = b;
	s->quantity = newQuantity;
}

int count(CStash* s)
{
	return s->next;
}

void* fetch(CStash* s, int index)
{
	assert(0 <= index);
	if (index >= s->next)  // 如果这个索引超出最大的索引就返回0,就结束了,
		return 0;
	return &(s->storage[index * s->size]);  //返回的是一个地址,
}

void cleanup(CStash* s)
{
	if (s->storage != 0)
	{
		free(s->storage);
	}
}

#include <iostream>
#include "Clib.h"
#include <fstream>  // 文件输入流,
#include <cassert>
#include <string>

using namespace std;

int main()
{
	CStash intStash, stringStash;
	const int bufsize = 80;

	initialize(&intStash, sizeof(int));
	for (int i = 0; i < 150; i++)
		add(&intStash, &i);
	for (int i = 0; i < count(&intStash); i++)
		cout << *(int*)fetch(&intStash, i) << endl;  // 利用指针将里边的数取出来,fetch是一个万能指针将其转化成int类型的,

	initialize(&stringStash, bufsize * sizeof(char));

	ifstream in;
	
	in.open("main.cpp");  // 这个是利用文件输入流去打开文件,
	assert(in);
	string line;
	while (getline(in, line))
		add(&stringStash, line.c_str());  // add 的第二个参数是c语言的指针,所以用c_str,
	int k = 0;
	char* cp;  //字符指针,
	while ((cp = (char*)fetch(&stringStash, k++)) != 0)
		cout << cp << endl;
	cleanup(&intStash);
	cleanup(&stringStash);

	system("pause");
	return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值