⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbuffer.cpp

📁 陈必红 编写的《用C++语言编写的数学常用算法》光盘内容
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <fstream.h>

#include "cbuffer.h"


ostream& operator<<(ostream& o, cbuffer& b)
{
	size_t maxitem = 5;
	for(size_t i=0; i<b.len(); i++) {
		o << b[i] << '\t';
		if(((i+1) % maxitem)==0)
			o << endl;
	}
	o << endl;
	return o;
}

// 将第n个值设为d,如果引用数大于1,则克隆出一个新的
// 复数缓存区,再作设置,返回作了设置的缓存区指针
cbuffer* cbuffer::set(size_t n, COMPLEX d)
{
	DOUBLE x,y;
	if(doadjust) {
		x = real(d);
		y = imag(d);
		d = COMPLEX(adjust(x),adjust(y));
	}
	if(refnum == 1) {
		retrieve(n) = d;
		return this;
	}
	refnum --;
	cbuffer * b;
	b = clone();
	(b->retrieve(n)) = d;
	return b;
}

// 克隆一个完全一样的缓存区
cbuffer* memcbuffer::clone()
{
	cbuffer* b;
	b = new memcbuffer(length);
	if(length > 0)
		for(size_t i=0; i<length; i++)
			(b->retrieve(i)) = (*this)[i];
	return b;
}

// 磁盘缓存区构造函数,打开临时文件
diskcbuffer::diskcbuffer(size_t lth):cbuffer(),length(lth),n(0)
{
	tempfp = tmpfile();
}


// 析构函数,关闭临时文件
diskcbuffer::~diskcbuffer()
{
	fclose(tempfp);
}

// 将缓存区尺寸改为num
void diskcbuffer::alloc(size_t num)
{
	length = num;
	if(!tempfp)
		tempfp = tmpfile();
	n = 0;
}

// 释放缓存区,关闭临时文件
void diskcbuffer::release()
{
	fclose(tempfp);
	buf = 0.0;
	length = 0;
}

// 返回第i个复数的引用,先将当前buf中的内容写入临时文件
COMPLEX& diskcbuffer::retrieve(size_t i)
{
	long off;
	off = n*sizeof(COMPLEX);
	fseek(tempfp, off, SEEK_SET);
	fwrite(&buf, sizeof(COMPLEX), 1, tempfp);
	off = i*sizeof(COMPLEX);
	fseek(tempfp, off, SEEK_SET);
	fread(&buf, sizeof(COMPLEX), 1, tempfp);
	n = i;
	return buf;
}

// 克隆一个内容完全相同的磁盘缓存区
cbuffer* diskcbuffer::clone()
{
	cbuffer* b;
	b = new diskcbuffer(length);
	if(length > 0)
		for(size_t i=0; i<length; i++)
			(b->retrieve(i)) = (*this)[i];
	return b;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -