1. unit Unit1;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls;
  6. type
  7. TForm1 = class(TForm)
  8. Memo1: TMemo;
  9. Button1: TButton;
  10. Button2: TButton;
  11. Button3: TButton;
  12. Button4: TButton;
  13. Button5: TButton;
  14. Button6: TButton;
  15. Button7: TButton;
  16. procedure Button1Click(Sender: TObject);
  17. procedure Button2Click(Sender: TObject);
  18. procedure Button3Click(Sender: TObject);
  19. procedure Button4Click(Sender: TObject);
  20. procedure Button5Click(Sender: TObject);
  21. procedure Button6Click(Sender: TObject);
  22. procedure Button7Click(Sender: TObject);
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28. var
  29. Form1: TForm1;
  30. implementation
  31. {$R *.dfm}
  32. const
  33. FileName = 'c:\temp\binary.dat';
  34. var
  35. F: file;
  36. //用无类型的方式写入一个字节
  37. procedure TForm1.Button1Click(Sender: TObject);
  38. var
  39. b: Byte;
  40. begin
  41. AssignFile(F,FileName);
  42. Rewrite(F,1); //第二个参数表示: 把 1 个字节当作一个写入单位
  43. b := 65;
  44. BlockWrite(F,b,1); //写入; 参数2是要写入的内容; 参数3表示写入 1 次.
  45. CloseFile(F);
  46. //落实 binary.dat 的大小: 1个字节; 内容: A (可用记事本打开)
  47. end;
  48. //用无类型的方式读出一个字节
  49. procedure TForm1.Button2Click(Sender: TObject);
  50. var
  51. b: Byte;
  52. begin
  53. AssignFile(F,FileName);
  54. Reset(F,1); //把 1 个字节当作一个读取单位
  55. BlockRead(F,b,1); //读取一次; 放入 b
  56. ShowMessage(Chr(b)); //A
  57. CloseFile(F);
  58. end;
  59. //写入更多字节
  60. procedure TForm1.Button3Click(Sender: TObject);
  61. var
  62. buffer: array[0..127] of Byte;
  63. i: Integer; //储存多个字节, 需要用数组了
  64. begin
  65. for i := Low(buffer) to High(buffer) do
  66. buffer[i] := i; //给数组赋值, 注意现在数组大小是 128
  67. AssignFile(F,FileName);
  68. Rewrite(F,32); //规定把 32 个字节当作一个读取单位, 注意这个数字和缓冲区大小必须是倍数关系
  69. BlockWrite(F,buffer,4); //需要写入几次呢? 128/32=4
  70. CloseFile(F);
  71. //写成的文件肯定是128字节大小, 但用记事本可能看不了, 因为这个二进制不是文本
  72. end;
  73. //读出
  74. procedure TForm1.Button4Click(Sender: TObject);
  75. var
  76. buffer: array[0..127] of Byte;
  77. i: Integer;
  78. begin
  79. AssignFile(F,FileName);
  80. Reset(F,4); //把 4 字节当作一个读取单位; 为了那个倍数关系, 这里一般是 1
  81. BlockRead(F,buffer,32); //当然需要 32 次才能读完
  82. CloseFile(F);
  83. //怎么显示一下呢? 还是用 Memo 吧; 显示字符? 数字? 还是十六进制吧
  84. Memo1.Clear;
  85. for i := Low(buffer) to High(buffer) do
  86. begin
  87. Memo1.Lines.Add(IntToHex(buffer[i],1));
  88. end;
  89. (*显示结果: 0 1 2 3 ... 7D 7E 7F *)
  90. end;
  91. //读写 Char 与实际读写字节
  92. procedure TForm1.Button5Click(Sender: TObject);
  93. var
  94. cArr1,cArr2: array[0..4] of Char;
  95. i: Integer;
  96. num: Integer; //记录实际读写的字节数
  97. begin
  98. for i := Low(cArr1) to High(cArr1) do
  99. cArr1[i] := Chr(65+i); //填充 A B C D E
  100. AssignFile(F,FileName);
  101. Rewrite(F,1); //建立
  102. BlockWrite(F,cArr1,Length(cArr1),num); //参数4: num 是实际写入的字节数
  103. ShowMessage(IntToStr(num)); //5
  104. Reset(F,1); //重新打开
  105. BlockRead(F,cArr2,Length(cArr2),num); //参数5: num 是实际读出的字节数
  106. ShowMessage(IntToStr(num)); //5
  107. ShowMessage(cArr2); //ABCDE
  108. CloseFile(F);
  109. end;
  110. //写入长字符串, 读出其十六进制码
  111. procedure TForm1.Button6Click(Sender: TObject);
  112. var
  113. p: PChar;
  114. b: Byte;
  115. begin
  116. p := '万一的 Delphi 博客';
  117. AssignFile(F,FileName);     //关联文件名
  118. Rewrite(F,1);               //创建并打开
  119. BlockWrite(F,p,Length(p));  //写入
  120. FileMode := fmOpenRead;     //这时可以设文件为只读
  121. Reset(F,1);                 //为读取打开
  122. Memo1.Clear;
  123. while not Eof(F) do
  124. begin
  125. BlockRead(F,b,1);
  126. Memo1.Text := Memo1.Text + IntToHex(b,2) + ' ';
  127. end;
  128. //显示结果: 70 F0 45 00 08 F7 12 00 A6 FB 43 00 A0 1A E5 00 FF C5
  129. CloseFile(F);
  130. end;
  131. //复制个文件
  132. procedure TForm1.Button7Click(Sender: TObject);
  133. var
  134. FromF,ToF: file;
  135. NumRead,NumWritten: Integer;
  136. Buffer: array[1..2048] of Byte;
  137. begin
  138. AssignFile(FromF, 'c:\temp\test1.dat'); //假定有这个文件
  139. Reset(FromF, 1);
  140. AssignFile(ToF, 'c:\temp\test2.dat');
  141. Rewrite(ToF, 1);
  142. repeat
  143. BlockRead(FromF, Buffer, SizeOf(Buffer), NumRead);
  144. BlockWrite(ToF, Buffer, NumRead, NumWritten);
  145. until (NumRead = 0) or (NumWritten <> NumRead);
  146. { NumRead=0 表示读完了; NumWritten <> NumRead 表示磁盘空间不够了 }
  147. CloseFile(FromF);
  148. CloseFile(ToF);
  149. end;
  150. end.

http://peirenlei.iteye.com/blog/319562

delphi中无类型文件读写的更多相关文章

  1. delphi中如何实现文件的复制?

    http://zhidao.baidu.com/link?url=nyAzCpeXAbaT8M3qqAePCF1Zr7q-oK4hpAUNIaRYpHcbmIwYsLr1TXoTt8759HtR1EB ...

  2. DELPHI中枚举类型数据的介绍和使用方法

    在看delphi程序的时候看到aa=(a,b,c,d);这样的东西,还以为是数组,同事说是函数,呵呵,当然这两个都不屑一击,原来这样式子是在声明并付值一个枚举类型的数据.下边写下来DELPHI中枚举类 ...

  3. delphi中的各种文件类型介绍【转】

    1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...

  4. delphi中的各种文件类型介绍

    1.DPR: Delphi Project文件,包含了Pascal代码.应用系统的工程文件2.PAS: Pascal文件,Pascal单元的源代码,可以是与窗体有关的单元或是独立的单元.3.DFM:D ...

  5. 在Delphi中编写res文件

    delphiimagedosinterfaceborland脚本先用记事本编写一个rc的文件. 如内容为: _Comms RCData Comms.jpg Comms.jpg为图片名称, 然后在这个r ...

  6. 在Delphi中编辑res文件

    先用记事本编写一个rc的文件.如内容为:_Comms RCData Comms.jpg Comms.jpg为图片名称,然后在这个rc文件和图片拷贝到delphi安装路径的bin文件夹里面,选中这两个文 ...

  7. C#中的CSV文件读写

    目录 CSV文件标准 文件示例 RFC 4180 简化标准 读写CSV文件 使用CsvHelper 使用自定义方法 基于简化标准的写CSV文件 使用TextFieldParser解析CSV文件 使用正 ...

  8. Go中简单的文件读写

    Go中的ioutil包可以方便的实现文件读写.代码: package main import ( "fmt" "io/ioutil" ) func main() ...

  9. Delphi中String类型原理介绍

    Delphi中字符串的操作很简单,但幕后情况却相当复杂.Pascal传统的字符串操作方法与Windows不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型,该类型 ...

随机推荐

  1. [javascript]一种兼容性比较好的简单拖拽

    作为一个马上要找工作.非计算机专业.热爱前端的大四狗,最近开始疯狂写demo.看书,准备九.十月份的校招. 晚上用js实现了一个比较简单(low)的拖拽效果,初步测试兼容性还是不错的,于是写一段小博文 ...

  2. USACO Healthy Holsteins DFS

    使用排列组合,遍历所有可能的情况C(1)+C(2)+C(3)……C(n)= 2^G种组合 数据规模不大,暴力过去最多也就是2^15 = 23768种情况 所以就暴力咯,不过还是Debug了一会 Sou ...

  3. USACO Milk2 区间合并

    这题WA了四次,后来发现不能用所谓的桶排来写 虽然空间上是可以的,但是存在这样一个问题 比如两组数据[15,20]和[21,30] 在20 和 21这两个时刻之间没有milking,但是用桶排的方法写 ...

  4. 【引用】Linux 内核驱动--多点触摸接口

    本文转载自James<Linux 内核驱动--多点触摸接口>   译自:linux-2.6.31.14\Documentation\input\multi-touch-protocol.t ...

  5. 批量的单向的ssh 认证

    <pre name="code" class="python">if [ ! $# -eq 2 ] ;then echo "请输入用户密码 ...

  6. android的animator

    3.0 以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这 ...

  7. 算法之旅,直奔<algorithm>之十 count_if

    count_if(vs2010) 引言 这是我学习总结<algorithm>的第十篇,这个重要的地方是设置条件.用的还是蛮多的.(今天下午挺恶心的,一下午就做一个面试题,调代码调傻了... ...

  8. Qt学习之路(54): 自定义拖放数据对象

    前面的例子都是使用的系统提供的拖放对象 QMimeData 进行拖放数据的存储,比如使用 QMimeData::setText() 创建文本,使用 QMimeData::urls() 创建 URL 对 ...

  9. Solr搜索结果说明

    在admin页面,输入相关内容后,会返回xml格式的内容.说明如下: [html] view plaincopy <?xml version="1.0" encoding=& ...

  10. mysql字符串连接,重复等字符串函数总结

    mysql concat()函数 MySQL的concat函数可以连接一个或者多个字符串,如 select concat('10'); 输出 10 select concat('11','22','3 ...