Đọc thông tin nhị phân từ tập tin trong csharp

c-sharp

(Phạm Quyết Nghị) #1

Trong phần trước chúng ta đã thực hiện việc viết thông tin nhị phân vào trong tập tin, và bây giờ chúng ta mong muốn được đọc các thông tin đã ghi vào trong tập tin. Việc đọc thông tin cũng khá đơn giản như là việc viết vào. Chương trình 12.10 sau minh họa cho công việc này.

Ví dụ 12.10: Đọc thông tin nhị phân.

// BinaryRead.cs: Doc thong tin tu file nhi phan
namespace Programming_CSharp
{
	using System;
	using System.IO;
	public class Tester
	{
		public static void Main( String[] args)
		{
			if ( args.Length < 1)
			{
				Console.WriteLine(“Phai nhap ten tap tin”);
			}
			else
			{
				FileStream myFile = new FileStream( args[0], FileMode.Open);
				BinaryReader brFile = new BinaryReader(myFile);
				
				// đọc dữ liệu
				Console.WriteLine(“Dang doc tap tin....”);
				
				while (brFile.PeekChar() != -1)
				{
					Console.Write(“<{0}>”, brFile.ReadInt32());
				}
				
				Console.WriteLine(“....Doc xong”);
				brFile.Close();

				myFile.Close();
			}
		}
	}
}

Kết quả:

Dang doc tap tin....
<0> <1> <2> <3> <4> <5> <6> <7> <8> <9> <10> <11> <12> <13> <14> <15> <16>
<17>
<18> <19> <20> <21> <22> <23> <24> <25> <26> <27> <28> <29> <30> <31> <32>
<33>
<34> <35> <36> <37> <38> <39> <40> <41> <42> <43> <44> <45> <46> <47> <48>
<49>
<50> <51> <52> <53> <54> <55> <56> <57> <58> <59> <60> <61> <62> <63> <64>
<65>
<66> <67> <68> <69> <70> <71> <72> <73> <74> <75> <76> <77> <78> <79> <80>
<81>
<82> <83> <84> <85> <86> <87> <88> <89> <90> <91> <92> <93> <94> <95> <96>
<97>
<98> <99> ....Doc xong!

Với ứng dụng này, chúng ta có thể đọc dữ liệu mà chúng ta đã viết trong ví dụ trước. Trong ví dụ này chúng ta tạo ra luồng FileStream. Lúc này, mode thao tác của tập tin được sử dụng là mode FileMode.Open. Sau đó chúng ta thực hiện việc gắn luồng này với luồng BinaryReader trong dòng tiếp sau, luồng này sẽ giúp cho chúng ta đọc thông tin nhị phân:

FileStream myFile = new FileStream( args[0], FileMode.Open);
BinaryReader brFile = new BinaryReader(myFile);

Sau khi tạo ra luồng giúp cho việc đọc thông tin nhị phân từ tập tin, chương trình bắt đầu đọc thông qua vòng lặp:

while (brFile.PeekChar() != -1)
{
	Console.Write(“<{0}>”, brFile.ReadInt32());
}

Ở đây có một vài sự khác nhỏ, phương thức PeekChar của lớp BinaryReader được sử dụng. Phương thức này sẽ lấy ký tự kế tiếp trong luồng. Nếu ký tự kế tiếp là cuối tập tin thì giá trị -1 được trả về. Ngược lại, thì ký tự kế tiếp được trả về Khi ký tự kế tiếp không phải ký tự cuối tập tin thì lệnh bên trong vòng lặp sẽ đọc một số integer từ đối tượng BinaryStream brFile.

Phương thức được sử dụng để đọc một số nguyên là ReadInt32, chúng ta sử dụng kiểu tên của Framework tốt hơn là kiểu do C# đưa ra. Nên nhớ rằng, tất cả những lớp từ Framework điều được gọi bởi ngôn ngữ C# và chúng không phải là một bộ phận của ngôn ngữ C#. Những lớp này còn được sử dụng tốt bởi những ngôn ngữ khác C#.

Ngoài ra lớp BinaryReader còn có những phương thức khác để thực hiện việc đọc các kiểu dữ liệu khác nhau. Những phương thức đọc này được sử dụng cùng với cách mà ReadInt32 được sử dụng trong chương trình. Bảng 12.4 sau liệt kê một số phương thức dùng để đọc các kiểu dữ liệu

Các phương thức đọc của BinaryReader

Read
Đọc những ký tự và chuyển vị trí đọc sang vị trí tiếp theo. Phương thức này được nạp chồng gồm 3 phương thức.

ReadBoolean
Đọc một giá trị boolean từ luồng hiện thời và chuyển vị trí đọc sang một byte.

ReadByte
Đọc byte kế tiếp từ luồng hiện thời và chuyển vị trí đọc sang 1 byte.

ReadBytes
Đọc n byte từ luồng hiện thời sang một mảng byte và chuyển vị trí đọc sang n byte.

ReadChar
Đọc vị trí kế tiếp trong luồng hiện hành và chuyển vị trí đọc của luồng theo sau sử dụng mã hóa và ký tự xác định được đọc từ luồng.

ReadChars
Đọc n ký tự từ luồng hiện hành vào một mảng n ký tự. Và chuyển vị trí đọc của luồng theo sau sử dụng mã hóa và ký tự xác định được đọc từ luồng.

ReadDecimal
Đọc giá trị decimal và chuyển vị trí đọc sang 16 byte.

ReadDouble
Đọc giá trị thực 8 byte và chuyển vị trí đọc sang 8 byte.

ReadInt16
Đọc giá trị 2 byte integer có dấu và chuyển vị trí đọc sang 2 byte.

ReadInt32
Đọc giá trị 4 byte integer có dấu và chuyển vị trí đọc sang 4 byte.

ReadInt64
Đọc giá trị 8 byte integer có dấu và chuyển vị trí đọc sang 8 byte

ReadSByte
Đọc một signed byte từ luồng và chuyển vị trí đọc sang 1 byte.

ReadSingle
Đọc giá trị thực 4 byte từ luồng và chuyển vị trí đọc sang 4 byte.

ReadString
Đọc một chuỗi từ luồng. Chuỗi được cố định chiều dài trước. Và được mã hóa mỗi lần như là số nguyên 7 bit.

ReadUInt16
Đọc giá trị 2-byte unsigned integer từ luồng. Sử dụng mã hóa thứ tự nhỏ ở cuối (little endian encoding). Và chuyển vị trí hiện hành sang 2 byte.

ReadUInt64
Đọc 8-byte unsigned integer từ luống hiện hành và chuyển sang 8 byte


89% Thành viên có cách giải cho một câu hỏi. Bạn thì sao?