CBUFFER.CPP
上传用户:zengbais
上传日期:2022-08-08
资源大小:49k
文件大小:2k
开发平台:

C++ Builder

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <fstream.h>
  4. #include "cbuffer.h"
  5. ostream& operator<<(ostream& o, cbuffer& b)
  6. {
  7. size_t maxitem = 5;
  8. for(size_t i=0; i<b.len(); i++) {
  9. o << b[i] << 't';
  10. if(((i+1) % maxitem)==0)
  11. o << endl;
  12. }
  13. o << endl;
  14. return o;
  15. }
  16. // 将第n个值设为d,如果引用数大于1,则克隆出一个新的
  17. // 复数缓存区,再作设置,返回作了设置的缓存区指针
  18. cbuffer* cbuffer::set(size_t n, COMPLEX d)
  19. {
  20. DOUBLE x,y;
  21. if(doadjust) {
  22. x = real(d);
  23. y = imag(d);
  24. d = COMPLEX(adjust(x),adjust(y));
  25. }
  26. if(refnum == 1) {
  27. retrieve(n) = d;
  28. return this;
  29. }
  30. refnum --;
  31. cbuffer * b;
  32. b = clone();
  33. (b->retrieve(n)) = d;
  34. return b;
  35. }
  36. // 克隆一个完全一样的缓存区
  37. cbuffer* memcbuffer::clone()
  38. {
  39. cbuffer* b;
  40. b = new memcbuffer(length);
  41. if(length > 0)
  42. for(size_t i=0; i<length; i++)
  43. (b->retrieve(i)) = (*this)[i];
  44. return b;
  45. }
  46. // 磁盘缓存区构造函数,打开临时文件
  47. diskcbuffer::diskcbuffer(size_t lth):cbuffer(),length(lth),n(0)
  48. {
  49. tempfp = tmpfile();
  50. }
  51. // 析构函数,关闭临时文件
  52. diskcbuffer::~diskcbuffer()
  53. {
  54. fclose(tempfp);
  55. }
  56. // 将缓存区尺寸改为num
  57. void diskcbuffer::alloc(size_t num)
  58. {
  59. length = num;
  60. if(!tempfp)
  61. tempfp = tmpfile();
  62. n = 0;
  63. }
  64. // 释放缓存区,关闭临时文件
  65. void diskcbuffer::release()
  66. {
  67. fclose(tempfp);
  68. buf = 0.0;
  69. length = 0;
  70. }
  71. // 返回第i个复数的引用,先将当前buf中的内容写入临时文件
  72. COMPLEX& diskcbuffer::retrieve(size_t i)
  73. {
  74. long off;
  75. off = n*sizeof(COMPLEX);
  76. fseek(tempfp, off, SEEK_SET);
  77. fwrite(&buf, sizeof(COMPLEX), 1, tempfp);
  78. off = i*sizeof(COMPLEX);
  79. fseek(tempfp, off, SEEK_SET);
  80. fread(&buf, sizeof(COMPLEX), 1, tempfp);
  81. n = i;
  82. return buf;
  83. }
  84. // 克隆一个内容完全相同的磁盘缓存区
  85. cbuffer* diskcbuffer::clone()
  86. {
  87. cbuffer* b;
  88. b = new diskcbuffer(length);
  89. if(length > 0)
  90. for(size_t i=0; i<length; i++)
  91. (b->retrieve(i)) = (*this)[i];
  92. return b;
  93. }