IT你好

加入 |登录

IT你好技术论坛广场红黑技术 › 查看主题

60

查看

1

回复
返回列表

帖子
精华
积分
25 
UID
1525 
go

C#按二进制模式读写文件

1
发表于 2013-1-29 17:45 | 只看该作者 | 倒序看帖 | 打印
本帖最后由 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);
它表示对输出进行格式化{} 中使用的第二个数表示输出占据的屏幕位数正
数表示从右边起计而负数表示从左边起计。

TOP

Administrator

Administrator

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

帖子
297 
精华
积分
1400 
UID
1467 
2
发表于 2013-2-5 11:51 | 只看该作者
好帖是顶出来滴!
谁都不知道今天过去明天会如何,你现在要做的就是善待眼下的这一分钟、这一小时、这一天。

TOP

IT你好技术论坛

GMT+8, 2026-1-13 07:36, Processed in 0.019096 second(s), 14 queries.

Powered by Discuz! X1

© 2001-2010 Comsenz Inc.