C#读写二进制文件

原文

本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件。
第一步:读写文件转成流对象。其实就是读写文件流 (FileStream对象,在System.IO命名空间中)。File、FileInfo、FileStream这三个类可以将打开文件,并变成文件 流。下面是引用微软对File、FileInfo、FileStream的介绍
System.IO.File类 提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。
System.IO.FileInfo类 提供创建、复制、删除、移动和打开文件的实例方法,并且帮助创建 FileStream 对象。无法继承此类。
System.IO.FileStream类 公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。
我直接使用 FileStream,他继承于Stream
第二步:读写流。读写二进制文件用System.IO.BinaryReader和System.IO.BinaryWriter类;读写文本文件用System.IO.TextReader和System.IO.TextWriter类。下面是我的实体 (即要保持到文件的数据)

 1 /// <summary>
 2 /// 学生基本信息类
 3 /// </summary>
 4 public class Student
 5 {
 6 /// <summary>
 7 /// 学号变量
 8 /// </summary>
 9 private String _id;
10 /// <summary>
11 /// 姓名变量
12 /// </summary>
13 private String _name;
14 /// <summary>
15 /// 语文成绩变量
16 /// </summary>
17 private Double _score1;
18 /// <summary>
19 /// 数学成绩变量
20 /// </summary>
21 private Double _score2;
22 /// <summary>
23 /// 英语成绩变量
24 /// </summary>
25 private Double _score3;
26 /// <summary>
27 /// 学号属性
28 /// </summary>
29 public String Id
30 {
31 get { return _id; }
32 set { _id = value; }
33 }
34 /// <summary>
35 /// 姓名属性
36 /// </summary>
37 public String Name
38 {
39 get { return _name; }
40 set { _name = value; }
41 }
42 /// <summary>
43 /// 语文成绩属性
44 /// </summary>
45 public Double Score1
46 {
47 get { return _score1; }
48 set { _score1 = value; }
49 }
50 /// <summary>
51 /// 数学成绩属性
52 /// </summary>
53 public Double Score2
54 {
55 get { return _score2; }
56 set { _score2 = value; }
57 }
58 /// <summary>
59 /// 英语成绩属性
60 /// </summary>
61 public Double Score3
62 {
63 get { return _score3; }
64 set { _score3 = value; }
65 }
66 }

下面是我的读方法,读取文件中的信息到参数List<Student> stu中

 1 /// <summary>
 2 /// 读取信息方法
 3 /// </summary>
 4 /// <returns>读取是否成功</returns>
 5 public void ReadInfo(List<Student> stu)
 6 {
 7 Console.WriteLine("请输入文件读取路径:(键入回车为默认路径)");
 8 String filename = Console.ReadLine();
 9 FileStream fs;
10 //默认路径
11 if (filename == "")
12 {
13 fs = new FileStream("student.dll", FileMode.Open);
14 }
15 else
16 {
17 //如果文件不存在,就提示错误
18 if (!File.Exists(filename))
19 {
20 Console.WriteLine("\n\t读取失败!\n错误原因:可能不存在此文件");
21 return;
22 }
23 //否则创建文件
24 fs = new FileStream(filename, FileMode.Open);
25 }
26 //使用二进制读取
27 BinaryReader br = new BinaryReader(fs);
28 Console.Write("读取信息将覆盖现有的信息,继续吗?y/n :");
29 String command = Console.ReadLine();
30 if (command == "y" || command == "Y")
31 {
32 for (int i = 0; i < stu.Count; i++)
33 {
34 stu.RemoveAt(i);
35 }
36 //从磁盘上读取信息
37 try
38 {
39 while (true)
40 {
41 Student student = new Student();
42 student.Id = br.ReadString();
43 student.Name = br.ReadString();
44 student.Score1 = br.ReadDouble();
45 student.Score2 = br.ReadDouble();
46 student.Score3 = br.ReadDouble();
47 stu.Add(student);
48 student = null;
49 }
50 }
51 catch (Exception)
52 {
53 Console.WriteLine("\n\n读取结束!");
54 }
55 }
56 br.Close();
57 fs.Close();
58 }

下面是我的写入方法,写入参数List<Student> stu中的数据

 1 /// <summary>
 2 /// 写入信息方法
 3 /// </summary>
 4 /// <returns>写入是否成功</returns>
 5 public void WriteInfo(List<Student> stu)
 6 {
 7 Console.WriteLine("请输入文件保存路径:(键入回车为默认路径)");
 8 FileStream fs;
 9 String filename = Console.ReadLine();
10 //默认路径
11 if (filename == "")
12 {
13 fs = new FileStream("student.dll", FileMode.Create);
14 }
15 //手动输入路径
16 else
17 {
18 //如果文件存在,就提示错误
19 if (File.Exists(filename))
20 {
21 Console.WriteLine("\n\t保存失败!\n错误原因:可能存在相同文件");
22 return;
23 }
24 //否则创建文件
25 fs = new FileStream(filename, FileMode.Create);
26 }
27 //数据保存到磁盘中
28 BinaryWriter bw = new BinaryWriter(fs);
29 foreach (Student student in stu)
30 {
31 bw.Write((String)student.Id);
32 bw.Write((String)student.Name);
33 bw.Write((Double)student.Score1);
34 bw.Write((Double)student.Score2);
35 bw.Write((Double)student.Score3);
36 bw.Flush();
37 }
38 bw.Close();
39 fs.Close();
40 Console.WriteLine("保存成功!");
41 }
时间: 2024-08-15 06:02:08

C#读写二进制文件的相关文章

C/C++读写二进制文件

C++读写二进制文件 最近在给android层提供支持,因此代码都是用标准库库函数写出来的,好多windows和第三方的库不能或者很难使用,下面有我在读写二进制文件时候的一些心得,也算是一种总结吧 1.读二进制信息 1 bool bRet = true; 2 std::ofstream fout(szDestFile, std::ios::binary | std::ios::app); 3 std::ifstream fin(szOrigFile, std::ios::binary); 4 5

C#本地读写二进制文件

本文要介绍的C#本地读写二进制文件,二进制文件指保存在物理磁盘的一个文件. 第一步:读写文件转成流对象.其实就是读写文件流 (FileStream对象,在System.IO命名空间中).File.FileInfo.FileStream这三个类可以将打开文件,并变成文件 流.下面是引用微软对File.FileInfo.FileStream的介绍System.IO.File类 提供用于创建.复制.删除.移动和打开文件的静态方法,并协助创建 FileStream 对象.System.IO.FileIn

【转】C++读写二进制文件

原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章,遂进行了一些试验,并进行了部分的总结. 使用C++操作文件,是研发过程中比较频繁的,因此进行必要的总结和封装还是十分有用的.今天在网上找到一篇,遂进行了部分的试验,以记之,备后用. 本文读写文件均使用文件流进行操作,主要使用的类是ifstream, ofstream, 使用时,请务必包含文件fst

[Matlab+C/C++] 读写二进制文件

introduction 由于Matlab操作简单.方便,它被应用于非常多领域:音频处理,图像处理,数值计算等.虽然MATLABeasy操作.但受限于他的语言解释机制.MATLAB的运行速度通常较低.C/C++一般被觉得是运行较为高效的高级程序设计语言. 假设结合MATLAB和C/C++.或许我们能够获得操作简便性和运行速度的折中.这样的结合的一般形式是:MATLAB负责绝大部分工作,C/C++负责一些关键部分的实现.其详细方法在我之前的博文中已经有所介绍. 在处理某些数据的时候,可能涉及到文件

Java读写二进制文件示例

相对于文本文件,二进制文件读写快,定位快而准,下面是代码示例: import java.io.DataInput; import java.io.DataOutput; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; import java.util.ArrayList; import java.util.List; class Employee{

Java读写二进制文件操作

/**  * 二进制读写文件  */ import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; public class MainClass { /**

C语言 读写二进制文件

查找了比较多的资源, 发现没有办法把text 文件转成binary文件 仅作为记录,不过这个例子可以去除换行符. #include <stdio.h> #include <string.h> #define N 255 int main() {  char a[N];  FILE *fp1,*fp2;  fp1=fopen("test_seq.fa","r");  fp2=fopen("testSeq.dat","

windows API读写二进制文件

其实,如果你学习过C语言的话,直接用 stdio.h 中函数是最简单的,也就是使用 fopen( "xxxx.xxx", "rb" ); 然后再调用 fread/fwrite; 关闭时调用 fclose 就可以了. 如果使用 Windows Native API 中的 CreateFile, 是不需要区分什么二进制不二进制的,只要此函数的返回值不是 INVALID_HANDLE_VALUE, 就可以继续使用 ReadFile/WriteFile 来进行读写,最后再用

fread和fwrite和feof读写二进制文件

#include <stdio.h> #include <stdlib.h> void text_to_bin(char *argv[]); void bin_to_text(); typedef struct { int xh; char name[20]; int age; }Student; int main(int a,char *argv[]){ if(a!=4){ printf("参数不够!\n"); } text_to_bin(argv); bin