Как использовать BinaryReader и правильно вводить данные в файл? - PullRequest
3 голосов
/ 20 октября 2011

Я работаю над своим домашним заданием, и я полностью застрял!Я пытаюсь использовать уже определенный ввод и сохранить его в файл с помощью метода saveDataTo () и прочитать ввод с помощью метода readDataFrom ().

Я застрял в первой части.Я не уверен, нужно ли мне сначала инициализировать данные в файле Program.cs?

Я не знаю, и я застрял.Вот код и надежда на несколько советов, как мне это сделать.

- РЕДАКТИРОВАТЬ -

Я могу добавить инструкции для обоих методов saveDataTo () и readDataFrom ():

Метод saveDataTo () принимает параметр BinaryWriter.Метод записывает значения всех 5 свойств объекта книги в поток файлов, связанный с записывающим устройством (связь выполняется в методе Main () класса Program).Внутри этого метода нет необходимости открывать и закрывать файловый поток и средство записи двоичных файлов.

Метод readDataFrom () принимает параметр BinaryReader.Метод считывает значения всех пяти свойств объекта Book из потока файлов, связанного с читателем (связь выполняется в методе Main () класса Program).Нет необходимости открывать и закрывать файловый поток и двоичное устройство чтения внутри этого метода.

Так что это дает мне подсказку, что я должен использовать и назначить свойства, которые будут сохранены в файле там?

- РЕДАКТИРОВАТЬ -

Обновлен код там.У меня проблема с содержимым, которое сохраняется в файл.Мне не показывают цену.Почему это так?

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.

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Вы спрашиваете, нужно ли определять значения в Program.cs или Book.cs, верно?Ну, это хорошо для определения значений в Program.cs, вам просто нужно убедиться, что все значения даны перед записью данных.

Итак, поскольку функция принимает параметр BinaryWriter, который предположительно инициализируется заранее, это должно работать:

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

Но, просто помните, что вам нужно определить всю информацию где-то (где угодно) перед вызовом сохранения данных.

1 голос
/ 20 октября 2011

Вы присваиваете свои параметры 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)

EDIT

Теперь вы показываете цену при получении, поскольку вы пишете ее как плавающее поле (или двойное, не видите определения) и читаете ее как целое число.

Изменение от r.ReadInt32 (); to r.ReadDouble (); или r.ReadSingle ()

...