3

私は宿題をしているのですが、完全に行き詰まっています!私がやろうとしているのは、すでに定義されている入力を使用し、saveDataTo()メソッドを使用してファイルに保存し、readDataFrom()メソッドを使用して入力を読み取ることです。

私は最初の部分で立ち往生しています。最初にProgram.csファイルのデータを初期化する必要があるかどうかわかりませんか?

わからない、行き詰まっている。ここにコードがあり、これを達成するためのヒントを期待しています。

- 編集 -

saveDataTo()メソッドとreadDataFrom()メソッドの両方の目的で命令を追加できます。

saveDataTo()メソッドはBinaryWriterのパラメーターを取ります。このメソッドは、ブックオブジェクトの5つのプロパティすべての値を、ライターに関連付けられたファイルストリームに書き込みます(関連付けは、ProgramクラスのMain()メソッドで行われます)。このメソッド内でファイルストリームとバイナリライターを開いたり閉じたりする必要はありません。

readDataFrom()メソッドはBinaryReaderのパラメーターを取ります。このメソッドは、リーダーに関連付けられたファイルストリームからBookオブジェクトの5つのプロパティすべての値を読み取ります(関連付けはProgramクラスのMain()メソッドで行われます)。このメソッド内でファイルストリームとバイナリリーダーを開いたり閉じたりする必要はありません。

それで、ファイルに保存するプロパティを使用して割り当てる必要があるという手がかりが得られますか?

- 編集 -

そこでコードを更新しました。ファイルに保存されているコンテンツに問題があります。価格は表示されていません。何故ですか?

ff.APublisherNameTitle  FirstNameLastName

Program.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();
        }
    }
}

Publication.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);
        }
    }
}

Book.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);
        }
    }
}

よろしく。

HelpNeeder。

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"; 

それとは別に、Java ではなく C# で作業しています。慣例により、メソッドを大文字で始めるのが普通です (パスカルの場合)

編集

浮動フィールド (または double、定義が表示されない) として書き込み、整数として読み取るため、読み取り時に価格が表示されるようになりました。

r.ReadInt32(); からの変更 r.ReadDouble(); に または r.ReadSingle()

于 2011-10-20T02:08:36.213 に答える