教学课件第13章 文件的输入和输出.ppt
C#程序设计案例教程程序设计案例教程第第13章章 文件的输入和输出文件的输入和输出 第第13章章 文件的输入和输出文件的输入和输出 学习目标学习目标掌握文本文件的读掌握文本文件的读/写。写。掌握二进制文件的读掌握二进制文件的读/写。写。第第13章章 文件的输入和输出文件的输入和输出 13.1 文件与流文件与流输入/输出操作功能是计算机程序的基本功能。在C#中,如何通过程序方式实现将内存中的数据存储至磁盘文件或将磁盘文件中的数据读入内存中,这涉及文件和流两个方面的内容。u 文件与流的概念文件是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合,是软件对数据进行读/写操作的基本对象。人们按树状目录形成组织文件。每个文件有文件名、所在路径、创建时间、访问权限等属性。流也是对数据进行读/写操作的基本对象,但它比文件的应用更为广泛。流也提供了连续的字节流存储空间。但它的实际数据存储位置可以不连续,甚至可以分布在多个磁盘中。由于这些存储方式对用户来说是透明的,用户平时所看到的都是封闭以后的数据结构,是连续的字节流抽象。流有多种类型,文件流就是其中的一种。第第13章章 文件的输入和输出文件的输入和输出 u 文件操作涉及的相关类(1)抽象类Stream。所有表示流的类都是从Stream类继承的,Stream是所有流的抽象基类。流是用于传输数据的对象,它有两个传输方向: . 读:将数据从外部数据源传输到程序中,这是读取流。 . 写:将数据从程序传输到外部数据源,这是写入流。(2)FileStream类:FileStream类继承于Stream类,它主要用于文件的输入和输出。(3)StreamReader类和StreamWriter类。FileStream适合于读取原始字节(二进制)数据,如果希望处理字符数据,那么StreamReader和StreamWriter等类更适合。这些类在后台使用一个FileStream对象,关闭StreamReader和StreamWriter也就关闭了底层的FileStream、StreamReader和StreamWriter类分别用于从文件读取字符顺序流和将字符顺序流写入文件中。(4)BinaryReader类和BinaryWriter类。这两个类提供了从字符串或原始数据到各种流之间的读/写操作,即用于二进制模式读/写文件。(5)File和Directory类。File类用于实现对文件的基本操作,包括对文件的创建、复制、移动、删除和打开。Directory类用地实现常见的各种目录操作,如对目录及其子目录的创建、移动、浏览。第第13章章 文件的输入和输出文件的输入和输出 第第13章章 文件的输入和输出文件的输入和输出 13.2 读读/写文本文件写文本文件【课堂案例课堂案例13-1】在学生成绩管理系统中,学生信息保存在一个名为在学生成绩管理系统中,学生信息保存在一个名为Student.txt的文件中,一个学生的记录在文件中占一行。现要求实的文件中,一个学生的记录在文件中占一行。现要求实现对文件现对文件Student.txt的读的读/写操作。写操作。(1)读取文件中所有学生的记录,并显示出来。)读取文件中所有学生的记录,并显示出来。(2)将插入的学生记录追加到文件尾部。)将插入的学生记录追加到文件尾部。【案例学习目标案例学习目标】掌握对文本文件的读取操作。掌握对文本文件的读取操作。 掌握对文本文件的写操作。掌握对文本文件的写操作。 【案例知识要点案例知识要点】StreamReader和和StreamWriter类的使用。类的使用。【案例完成步骤案例完成步骤】(1)读文本文件。)读文本文件。(2)写文本文件。)写文本文件。(3)实现应用程序)实现应用程序第第13章章 文件的输入和输出文件的输入和输出 13.2.1 读文本文件读文本文件 1.创建创建StreamReader对象对象StreamReader类有很多构造函数,根据构造函数所带的参类有很多构造函数,根据构造函数所带的参数列表不同,创建的对象也不同。这里采用带文件路径和数列表不同,创建的对象也不同。这里采用带文件路径和编码方式参数的构造函数创建对象。构造函数的原型为:编码方式参数的构造函数创建对象。构造函数的原型为:public StreamReader(string path,Encoding encoding)说明:说明:(1).NET将所有进行文件操作的类都包含在将所有进行文件操作的类都包含在System.IO命名空间,因此,命名空间,因此,必须在源文件的开始处添加必须在源文件的开始处添加using System.IO(2)参数)参数path表示需要读取的文件路径。表示需要读取的文件路径。(3)参数)参数encoding表示编码方法参数,常用的编码方法有表示编码方法参数,常用的编码方法有UTF8、ANSI、ASCIIT和和UNICODE.第第13章章 文件的输入和输出文件的输入和输出 2. 使用使用StreamReader对象读文本文件对象读文本文件实例化实例化StreamReader对象的,就可以通过该对象调用相应对象的,就可以通过该对象调用相应方法来实现文件的读取。下面介绍两种常用的读取文件的方法来实现文件的读取。下面介绍两种常用的读取文件的方法。方法。(1)ReadLine()方法:使用该方法读取文件,每次读取一行方法:使用该方法读取文件,每次读取一行数据。根据数据。根据课堂案例课堂案例13-1的要求,在文本文件的要求,在文本文件Student.txt中,一行数据即代表一个学生信息。因此,当中,一行数据即代表一个学生信息。因此,当读取一学生信息时,可以使用该方法将代表代表该学生的读取一学生信息时,可以使用该方法将代表代表该学生的整行数据全部读取到字符串中。整行数据全部读取到字符串中。(2)Read()方法:使用该方法读取文件,每次读取一个字符。方法:使用该方法读取文件,每次读取一个字符。第第13章章 文件的输入和输出文件的输入和输出 根据对课堂案例13-1的分析,我们使用ReadLine()方法,每次读取文件的一行数据来实现读取操作。下述代码给出了使用StreamReader类读取数据的实现过程。Class FileAccess public void FileRead() StreamReader sr; try sr = new StreamReader(“Student.txt”,Encoding.Default); string sLine; do sLine = sr.ReadLine(); Console.WriteLine(“0”,sLine); while(sLine != null) sr.Close(); Catch(System.Exception e) Console.WriteLine(“文件操作出错文件操作出错” + e.Message); 第第13章章 文件的输入和输出文件的输入和输出 13.2.2 写文本文件写文本文件 1.创建创建StreamWriter对象对象StreamWriter类有很多构造函数,根据构造函数所带参数不类有很多构造函数,根据构造函数所带参数不同,创建对象也不同。构造函数原型为:同,创建对象也不同。构造函数原型为:public StreamWriter(string path,bool append,Encoding encoding);说明:说明:(1)在)在StreamWriter构造函数中,构造函数中,path和和encoding参数的使用方法与在参数的使用方法与在StreamReader中的参数使用方法一样。中的参数使用方法一样。(2)append参数表示文件是否以追加方式打开。若为参数表示文件是否以追加方式打开。若为“true”,向文件写入的数据会向文件写入的数据会自动追加到文件的尾部;否则,需要在程序中指定数据写入的位置。自动追加到文件的尾部;否则,需要在程序中指定数据写入的位置。第第13章章 文件的输入和输出文件的输入和输出 2.使用使用StreamWriter对象写文本文件对象写文本文件实例化对象后,需要调用写文件方法。与实例化对象后,需要调用写文件方法。与StreamReader类类对应,在对应,在StreamWriter类中也提供了多种写文件的方法。类中也提供了多种写文件的方法。(1)WriteLine()方法:该方法是最简单的方式之一,写入方法:该方法是最简单的方式之一,写入一个字符流后,将在后面自动加上一个回车符。一个字符流后,将在后面自动加上一个回车符。(2)Write()方法:使用该方法可以写入一个字符、一个字符方法:使用该方法可以写入一个字符、一个字符数组,甚至写入字符数组的一部分。数组,甚至写入字符数组的一部分。第第13章章 文件的输入和输出文件的输入和输出 根据对课堂案例13-1的分析,我们采用WriteLine实现将学生信息写入文件的要求。下述方法用于实现对文件的写入操作,并放至在之前定义的FileAccess类中。Public void FileWrite() StreamWriter sw; string sLine = “”; Console.WriteLine(“请输入学生学号:请输入学生学号:”); sLine = sLine + Console.ReadLine() + “ ”; Console.WriteLine(“请输入学生姓名:请输入学生姓名:”); sLine = sLine + Console.ReadLine() + “ ”; Console.WriteLine(“出生年月出生年月”); sLine = sLine + Console.ReadLine() + “ ”; try sw = new StreamWriter(“Student.txt”,true,Encoding.Default); sw.WriteLine(sLine); sw.Close(); catch(System.Exception e) Console.WriteLine(“文件读写错误!文件读写错误!” + e.Message);13.2.3 实现应用程序实现应用程序 第第13章章 文件的输入和输出文件的输入和输出 演示应用程序编辑、编译和运行过程第第13章章 文件的输入和输出文件的输入和输出 课堂实践课堂实践13-1【任务任务1】在学生成绩管理系统中,课程信息保存在一个在学生成绩管理系统中,课程信息保存在一个名为名为Course.txt的文件中,一条课程信息的记录在文件中的文件中,一条课程信息的记录在文件中占一行。现要求实现对文件占一行。现要求实现对文件Course.txt的读的读/写操作。写操作。 (1)读取文件中所有课程的记录,并显示出来。读取文件中所有课程的记录,并显示出来。 (2)将插入的课程记录追加到文件尾部。将插入的课程记录追加到文件尾部。【任务任务2】在学生成绩管理系统中,学生成绩信息保存在在学生成绩管理系统中,学生成绩信息保存在一个名为一个名为Scores.txt文件中,一条学生成绩信息的记录在文件中,一条学生成绩信息的记录在文件中占一行。现要求实现对文件文件中占一行。现要求实现对文件Scores.txt的读的读/写操作。写操作。 (1)读取文件中所有学生成绩的记录,并显示出来。读取文件中所有学生成绩的记录,并显示出来。 (2)将插入的学生成绩记录追加到文件尾部。将插入的学生成绩记录追加到文件尾部。第第13章章 文件的输入和输出文件的输入和输出 13.3 二进制文件的读二进制文件的读/写写【课堂案例课堂案例13-2】学生成绩管理系统中,学生信息保存在学生成绩管理系统中,学生信息保存在Student.bin的的二进制文件中。现要求,实现对二进制文件二进制文件中。现要求,实现对二进制文件Student.bin的读的读/写操作。写操作。(1)读取文件中所有学生的信息,并显示到控制台中。)读取文件中所有学生的信息,并显示到控制台中。(2)将控制台中输入的新学生信息追加到文件尾部。)将控制台中输入的新学生信息追加到文件尾部。【案例学习目标案例学习目标】掌握使用掌握使用FileStream和和BinaryReader类实现二进制文件的读操作。类实现二进制文件的读操作。 掌握使用掌握使用FileStream和和BinaryWriter类实现二进制文件的写操作。类实现二进制文件的写操作。 【案例知识要点案例知识要点】FileStream、BinaryReader和和BinaryWriter类。类。【案例完成步骤案例完成步骤】(1)读二进制文件。)读二进制文件。(2)写二进制文件。)写二进制文件。(3)实现应用程序)实现应用程序第第13章章 文件的输入和输出文件的输入和输出 13.3.1 读二进制文件读二进制文件 1.创建创建FileStream对象对象FileStream类有很多构造函数,根据构造函数所带的参数列表不同,创类有很多构造函数,根据构造函数所带的参数列表不同,创建的对象也不同。下面给出了常用的创建建的对象也不同。下面给出了常用的创建FileStream 对象的示例代码:对象的示例代码:FileStream fs = new FileStream(FileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);说明:说明:(1)FileName:指出要访问的文件名。指出要访问的文件名。(2)FileMode:指定文件的打开模式。例如,创建一个新文件或打开一个已有文件指定文件的打开模式。例如,创建一个新文件或打开一个已有文件(3)FileAccess:指定文件的访问方式指定文件的访问方式只读、只写或可读只读、只写或可读/写。写。第第13章章 文件的输入和输出文件的输入和输出 FileMode、FileAccess都是枚举类型。这些枚举的值应是自我解释性的,各枚举类型可使用的值如下表所示。枚举值FileModeAppend、Create、CreateNew、Open、OpenOrCreate和和TruncateFileAccessRead、ReadWrite和和Write第第13章章 文件的输入和输出文件的输入和输出 2.创建创建BinaryReader对象对象这里采用格式较为简单的构造函数创建这里采用格式较为简单的构造函数创建BinaryReader对象,对象,创建示例如下:创建示例如下:BinaryReader br = new BinaryReader(fs); /带带FileStream类型参数的构造函数类型参数的构造函数到此,到此,BinaryReader实例对象已经创建完成。接下来,将要实例对象已经创建完成。接下来,将要通过对象调用相应的方法实现对二进制文件的读取操作。通过对象调用相应的方法实现对二进制文件的读取操作。第第13章章 文件的输入和输出文件的输入和输出 3.读二进制文件读二进制文件BinaryReader类提供了多种读取二进制文件的方法,ReadByte()是读取数据最简单的方式,它从流中读取一个字节,把结果转换成一个0255之间的整数。如果到达该流的末尾就返回-1。如果要一次读取多个字节,可以调用Read()方法,它可以把特定数量的字节读入到一个数组中。Read()方法返回实际读取的字节数。如果这个值是0,就表示到达了流的尾端。此外,还有ReadString()方法每次从文件的当前流中读取一个字符串。除了上面介绍的几种常用读取方式外,BinaryReader类还提供了许多其他特点的读取方式,在此不一一列举,有兴趣的读者可以查阅MSDN做进一步了解。第第13章章 文件的输入和输出文件的输入和输出 下面给出的方法BinaryFileRead用于实现二进制文件Student.bin的读取操作。public void BinaryFileRead() FileStream fs = new FileStream(“Student.bin”,FileMode.OpenOrCreate); BinaryReader br; try while(br.PeekChar()!=-1) string str = br.ReadString(); Console.WriteLine(“学生信息:学生信息:” + str); fs.Close();br.Close(); catch(Exception e) Console.WriteLine(“异常信息:异常信息:”+e.Message);第第13章章 文件的输入和输出文件的输入和输出 13.3.2 写二进制文件写二进制文件 1.创建创建FileStream对象对象和读二进制文件的步骤一样,使用和读二进制文件的步骤一样,使用BinaryWriter之前,要先创建之前,要先创建FileStream对象,对象,指出要写入的文件以及文件访问方式等。创建语句如下所示:指出要写入的文件以及文件访问方式等。创建语句如下所示:FileStream fs = new FileStream(FileName,FileMode.Append,FileAccess.Write);注意:注意:FileMode.Append只能与只能与FileAccess.Write一起使用。若定义了读操作将会引发一起使用。若定义了读操作将会引发System.ArgumentException异常。异常。第第13章章 文件的输入和输出文件的输入和输出 2.创建创建BinaryWriter对象对象我们使用和构造BinaryReader对象一样简单的构造函数,即只给出FileStream类型参数的构造函数。创建语句如下所示:BinaryWriter bw = new BinaryWriter(fs); 3.使用使用BinaryWriter写二进制文件写二进制文件创建BinaryWriter类的实例对象bw后,就可以通过对象调用方法实现对二进制文件的写操作。BinaryWriter类为写入数据到文件提供了Write()方法,该方法实现将数据写入当前流。根据写入数据类型的不同,BinaryWriter类也提供了多种格式的Write()重载方法。例如:bw.Write(“true”); /将字符串值”true”写入二进制文件 bw.Write(true); /将Boolean类型数据写入二进制文件 bw.Write(a); /将字符类型数据写入二进制文件阶了上述例子中所举类型外,还可以将整数、字符数组等数据类型的值写入二进制文件。第第13章章 文件的输入和输出文件的输入和输出 通过对课堂案例13-2的分析,我们需要实现将新学生信息写入二进制文件的操作。下面方法用于实现二进制文件夹的写操作。Public void BinaryFileWrite() FileStream fs = new FileStream(“Student.bin”,FileMode.Append, FileAccess.Write); BinaryWriter bw; try bw = new BinaryWriter(fs); Console.WriteLine(“请输入要添加的学生信息:请输入要添加的学生信息:”); bw.Write(Console.ReadLine(); fs.Close(); bw.Close(); catch(Exception e) Console.WriteLine(“异常异常:” + e.Message);13.3.3 实现应用程序实现应用程序 第第13章章 文件的输入和输出文件的输入和输出 演示应用程序编辑、编译和运行过程第第13章章 文件的输入和输出文件的输入和输出 课堂实践课堂实践13-2【任务任务1】用二进制文件读写方式实现用二进制文件读写方式实现课程实践课程实践13-1的的任务任务1。【任务任务2】用二进制文件读取方式实现用二进制文件读取方式实现课程实践课程实践13-1的的任务任务2。