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