IT你好技术论坛

标题: C#按二进制模式读写文件 [打印本页]

作者: wulangxiong    时间: 2013-1-29 17:45     标题: C#按二进制模式读写文件

本帖最后由 wulangxiong 于 2013-1-29 17:58 编辑

System.IO 还为我们提供了BinaryReader 和BinaryWriter 类用于按二进制模式读
写文件它们提供的一些读写方法是对称的比如针对不同的数据结构BinaryReader
提供了ReadByte ReadBoolean ReadInt ReadInt16 ReadDouble ReadString 等方法
而BinaryWriterz 则提供了WriteByte WriteBoolean WriteInt WriteInt16 WriteDouble
WriteString 方法
下面我们举一个通讯录的例子来说明BinaryReader 和BinaryWriter 类是如何使用
的。

using System;

using System.IO;

struct Record{

public
string name;

public
UInt16 age;

public
string phone;

public
string address;

};
//通讯录的记录格式

class
PhoneBook

{

FileStream
f_srm;

string
s_filename;

Record
m_record;

public
PhoneBook(string filename)

{

s_filename
= filename;

}

public
int
Open()

{
//显示初始化界面

Console.WriteLine("1: List Record");

Console.WriteLine("2: Add New Record");

Console.WriteLine("3: Erase Record");

Console.WriteLine("0: Exit");

int
i = Console.Read() -
'0';

return
i;

}

public
void
AddNew()

{
//向通讯录中添加记录

    try{

    f_srm =
new

FileStream(s_filename,FileMode.OpenOrCreate);

    }

    catch

    {

    Console.WriteLine("PhoneBookError!");

    return;

    }

    BinaryWriter pw =
new

BinaryWriter(f_srm);

    pw.Seek(0,SeekOrigin.End);

    string s_temp;

    Console.Write("Name:");

    Console.ReadLine();

    m_record.name = Console.ReadLine();

    pw.WriteString(m_record.name);

    reenter:

    Console.Write("Age: ");

    s_temp = Console.ReadLine();

    try{

    m_record.age = s_temp.ToUInt16();

    }

    catch

    {

    Console.WriteLine("The formatof age is error,please ReEnter");

    goto
reenter;

    }

    pw.Write(m_record.age);

    Console.Write("PhoneNumber: ");

    m_record.phone = Console.ReadLine();

    pw.WriteString(m_record.phone);

    Console.Write("Address:");

    m_record.address = Console.ReadLine();

    pw.WriteString(m_record.address);

    f_srm.Close();

    }

    public
void
List()

    {
//浏览所有记录

    try{

       f_srm =
new

FileStream(s_filename,FileMode.Open);

    }

    catch

    {

    Console.WriteLine("PhoneBookError!");

    return;

    }

    BinaryReader pr =
new

BinaryReader(f_srm);

    Console.WriteLine("Name AgePhone Number Address");

    Console.WriteLine("***************************************");

    while(true)

    {

    try{

    m_record.name = pr.ReadString();

    m_record.age = pr.ReadUInt16();

    m_record.phone = pr.ReadString();

    m_record.address = pr.ReadString();

    }

    catch{return;}

    Console.WriteLine("{0,-9}{1,-6}{2,-18}{3}",m_record.name,

           m_record.age,m_record.phone,m_record.address);

           }

           f_srm.Close();

           }

         
public

void
Erase()

           {
//清空所有记录

         
try{

           f_srm =
new

FileStream(s_filename,FileMode.Create);

           }

         
catch

           {

           Console.WriteLine("PhoneBook Error!");

         
return;

           }

           f_srm.Close();

           Console.WriteLine("Now the book is empty!");

           }

           }

class
Test

{

public
static
void
Main()

{

PhoneBook pbook =
new

PhoneBook(
"c:\\c#\\file\\Phone.book");

int
i = pbook.Open();

switch(i)

{

case
1:

pbook.List();

break;

case
2:

pbook.AddNew();

break;

case
3:

pbook.Erase();

}

}

}

}


         
其中有这么一条语句
Console.WriteLine("{0,-9}{1,-6}{2,-18}{3}",m_record.name,
m_record.age,m_record.phone,m_record.address);
它表示对输出进行格式化{} 中使用的第二个数表示输出占据的屏幕位数正
数表示从右边起计而负数表示从左边起计。

作者: Q_Lucky    时间: 2013-2-5 11:51

好帖是顶出来滴!




欢迎光临 IT你好技术论坛 (http://it.o-o.zone/) Powered by Discuz! X1