test.pas 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. CONST
  2. BUFSize = 8192;
  3. var
  4. {FReadBuf}
  5. RBBuf, RBread : ^BYTE;
  6. RBcount : word;
  7. RBsize : word;
  8. RBFirst, RBLast : boolean;
  9. {FReadBuf}
  10. Function FReadBuf(var F:FILE;var val:byte):boolean;
  11. begin
  12. if RBFirst then
  13. begin
  14. RBfirst:=false;
  15. GetMem(RBBuf,BUFSize);
  16. RBcount:=0;
  17. RBSize:=0;
  18. end;
  19. if RBLast then
  20. begin
  21. RBLast:=false;
  22. FreeMem(RBBuf,BufSize);
  23. RBFirst:=true;
  24. exit;
  25. end;
  26. If RBcount=RBsize then
  27. begin
  28. BlockRead(F,RBBuf^,BufSize,RBsize);
  29. if Rbsize=0 then
  30. begin
  31. FReadBuf:=false;
  32. exit;
  33. end;
  34. RBcount:=0;
  35. end;
  36. RBread:=PTR(SeG(RBBUF^),Ofs(RBbuf^)+RBcount);
  37. inc(RBcount);
  38. val:=RBread^;
  39. FReadBuf:=true;
  40. end; {FReadBuf}
  41. {-----------------------------------------}
  42. var
  43. {FWriteBuf}
  44. WBBuf,WBwrt : ^BYTE;
  45. WBcount : word;
  46. WBFirst, WBLast : boolean;
  47. {FWritebuf}
  48. Procedure FWriteBuf(var F:FILE;val:byte);
  49. begin
  50. if WBFirst then
  51. begin
  52. WBfirst:=false;
  53. GetMem(WBBuf,BUFSize);
  54. WBcount:=0;
  55. end;
  56. if WBLast then
  57. begin
  58. WBLast:=false;
  59. BlockWrite(F,WBBuf^,WBcount);
  60. FreeMem(WBBuf,BufSize);
  61. WBFirst:=true;
  62. exit;
  63. end;
  64. WBwrt:=PTR(SeG(WBBUF^),Ofs(WBbuf^)+WBcount);
  65. inc(WBcount);
  66. WBwrt^:=val;
  67. If WBcount=BUFsize then
  68. begin
  69. BlockWrite(F,WBBuf^,WBcount);
  70. WBcount:=0;
  71. end;
  72. end;{FWriteBuf}
  73. var
  74. i : byte;
  75. INP : FILE;
  76. OUT : FILE;
  77. BEGIN
  78. Assign(OUT,'test2.dat');
  79. Rewrite(OUT,1);
  80. Assign(INP,'test.dat');
  81. Reset(INP,1);
  82. WBFirst:=true;
  83. WBLast:=false;
  84. RBFirst:=true;
  85. RBLast:=false;
  86. WHILE FreadBuf(INP,i) do FWriteBuf(OUT,i);
  87. WBLast:=true;
  88. RBLast:=true;
  89. FWriteBuf(OUT,0);
  90. FReadBuf(INP,i);
  91. Close(OUT);
  92. Close(Inp);
  93. END.