3

我正在做我的家庭作业,我完全被困住了!我要做的是使用已经定义的输入并使用 saveDataTo() 方法将其保存到文件中,并使用 readDataFrom() 方法读取输入。

我被困在第一部分。我不确定是否必须先初始化 Program.cs 文件中的数据?

我不知道,我被困住了。这是代码,并希望获得一些提示,我可以如何做到这一点。

- 编辑 -

我可以为 saveDataTo() 和 readDataFrom() 方法添加说明:

saveDataTo() 方法采用 BinaryWriter 的参数。该方法将 book 对象的所有 5 个属性的值写入与 writer 关联的文件流(关联在 Program 类的 Main() 方法中完成)。此方法内无需打开和关闭文件流和二进制写入器。

readDataFrom() 方法接受 BinaryReader 的参数。该方法从与阅读器关联的文件流中读取 Book 对象的所有五个属性的值(关联在 Program 类的 Main() 方法中完成)。此方法内无需打开和关闭文件流和二进制读取器。

所以这给了我一个线索,我应该使用并分配要保存在文件中的属性?

- 编辑 -

更新了那里的代码。我确实对保存到文件中的内容有疑问。我没有被显示价格。这是为什么?

ff.APublisherNameTitle  FirstNameLastName

程序.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Lab_7
{
    class Program
    {
        private const string FILE_NAME = "lab07.dat";

        static void Main(string[] args)
        {
            //char ask;

            /*
            do
            {
                Console.Write("Enter Book Title: ");
                publication.Title = Console.ReadLine();
                Console.Write("Enter Author's First Name: ");
                book.AuthorFirstName = Console.ReadLine();
                Console.Write("Enter Author's Last Name: ");
                book.AuthorLastName = Console.ReadLine();
                Console.Write("Enter Publisher's Name: ");
                publication.PublisherName = Console.ReadLine();
                Console.Write("Enter Book Price: $");
                publication.Price = float.Parse(Console.ReadLine());
                Console.Write("Would like to enter another book? [Y or N] ");
                ask = char.Parse(Console.ReadLine().ToUpper());
            }
            while (ask == char.Parse("Y"));
            */

            Book book = new Book();

            book.Price = 10.9F;
            book.Title = "Title";
            book.PublisherName = "PublisherName";
            book.AuthorFirstName = "FirstName";
            book.AuthorLastName = "LastName";

            FileStream fileStream = new FileStream(FILE_NAME, FileMode.OpenOrCreate);
            BinaryWriter write = new BinaryWriter(fileStream);
            book.saveDataTo(write);
            write.Close();

            fileStream = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
            BinaryReader read = new BinaryReader(fileStream);
            book.readDataFrom(read);
            read.Close();
        }
    }
}

出版物.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Lab_7
{
    class Publication
    {
        private float price;
        private string publisherName, title;

        public float Price
        {
            get
            {
                return price;
            }
            set
            {
                price = value;
            }
        }

        public string PublisherName
        {
            get
            {
                return publisherName;
            }
            set
            {
                publisherName = value;
            }
        }

        public string Title
        {
            get
            {
                return title;
            }
            set
            {
                title = value;
            }
        }

        public void display()
        {
            Console.WriteLine("{0}\n{1}\n{2}", title, publisherName, price);
        }
    }
}

图书.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Lab_7
{
    class Book : Publication
    {
        private string authorFirstName, authorLastName;

        public string AuthorFirstName
        {
            get
            {
                return authorFirstName;
            }
            set
            {
                authorFirstName = value;
            }
        }

        public string AuthorLastName
        {
            get
            {
                return authorLastName;
            }
            set
            {
                authorLastName = value;
            }
        }

        public new void display()
        {
        }

        public string getAuthorName()
        {
            return authorFirstName + " " + authorLastName;
        }

        public void readDataFrom(BinaryReader r)
        {
            Price = r.ReadInt32();
            PublisherName = r.ReadString();
            Title = r.ReadString();
            authorFirstName = r.ReadString();
            authorLastName = r.ReadString();
        }

        public void saveDataTo(BinaryWriter w)
        {
            w.Write(base.Price);
            w.Write(base.PublisherName);
            w.Write(base.Title);
            w.Write(AuthorFirstName);
            w.Write(AuthorLastName);
        }
    }
}

问候。

帮助需要者。

4

2 回答 2

2

您是在问是否在 Program.cs 或 Book.cs 中定义值,对吗?好吧,可以在 Program.cs 中定义值,您只需要确保在写入数据之前给出所有值。

因此,由于该函数采用了一个应该事先初始化的 BinaryWriter 参数,因此应该可以:

public void saveDataTo(BinaryWriter w)
{
     w.Write(getAuthorName());
     //etc...
}

但是,请记住,在调用保存数据之前,您确实需要在某处(任何地方)定义所有信息。

于 2011-10-20T01:09:53.400 回答
1

您将参数分配给 2 个不同的对象,请参阅:

Publication publication = new Publication(); 
Book book = new Book(); 

两者都是驻留在内存中的单个实例。

您要么必须将出版物引用到这本书,例如:

Book book = new Book(); 
Publication publication = (Publication)book;

或者只是将当前分配给出版物的值直接分配给书,这样:

publication.PublisherName = "PublisherName"; 

变成

book.PublisherName = "PublisherName"; 

除此之外,您使用的是 C#,而不是 Java。按照惯例,用大写字母开始你的方法是正常的(Pascal Case)

编辑

您现在在读取时显示了价格,因为您将其写为浮动字段(或双精度字段,看不到定义)并将其读取为整数。

从 r.ReadInt32(); 改变 到 r.ReadDouble(); 或 r.ReadSingle()

于 2011-10-20T02:08:36.213 回答