Как использовать BinaryReader в цикле, чтобы я мог отображать порции информации в правильном формате? - PullRequest
1 голос
/ 20 октября 2011

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

Enter Book Title: Title 1
Enter Author's First Name: First 1
Enter Author's Last Name: Last 1
Enter Publisher's Name: Publisher 1
Enter Book Price: $1.1
Would like to enter another book? [Y or N] y
Enter Book Title: Title 2
Enter Author's First Name: First 2
Enter Author's Last Name: Last 2
Enter Publisher's Name: Publisher 2
Enter Book Price: $2.2
Would like to enter another book? [Y or N] n

Title 1
Publisher 1
1.1
First 1 Last 1

Title 2
Publisher 2
2.2
First 2 Last 2

Вместо этого я показываю только последнюю запись,Видишь проблему?Я не знаю, как отобразить все данные из папки данных с помощью цикла.

Я ценю любые советы, как это можно сделать.

Спасибо!

Вотмои файлы кодов:

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;

            if (!File.Exists(FILE_NAME))
            {
                FileStream fileStream = new FileStream(FILE_NAME, FileMode.OpenOrCreate);
            }

            Book book = new Book();

            FileStream writeStream = new FileStream(FILE_NAME, FileMode.Append);
            BinaryWriter write = new BinaryWriter(writeStream);

            do
            {
                Console.Write("Enter Book Title: ");
                book.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: ");
                book.PublisherName = Console.ReadLine();
                Console.Write("Enter Book Price: $");
                book.Price = float.Parse(Console.ReadLine());
                Console.Write("Would like to enter another book? [Y or N] ");
                ask = char.Parse(Console.ReadLine().ToUpper());

                book.saveDataTo(write);
            }
            while (ask == char.Parse("Y"));

            write.Close();

            FileStream readStream = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
            BinaryReader read = new BinaryReader(readStream);

            book.display();

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

Книга.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()
        {
            base.display();
            Console.WriteLine("{0}", getAuthorName());
        }

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

        public void readDataFrom(BinaryReader r)
        {

            base.Price = r.ReadSingle();
            base.PublisherName = r.ReadString();
            base.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.

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

Works!Спасибо!

    while (read.PeekChar() != -1)
    {
        book.readDataFrom(read);
        book.display();
    }

Кроме того, я должен был убедиться, что новый файл создается каждый раз, когда я запускаю программу!

Плюс, я должен убедиться, что я закрываю свой FileStreams, потому чтоЯ продолжаю сбой программы.

Ответы [ 2 ]

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

Вы забыли выполнить цикл.book.display показывает только одну книгу.Вы также забыли прочитать данные для книги.

Вы можете проверить, есть ли в файле больше данных, выполнив просмотр.Если peek возвращает -1, вы знаете, что данных больше нет.

Пример:

FileStream readStream = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
BinaryReader read = new BinaryReader(readStream);

while (read.PeekChar() != -1)
{
    book.readDataFrom(read);
    book.display();
}
1 голос
/ 20 октября 2011

Используйте binaryReader.PeekChar () метод.

while(binaryReader.PeekChar()!=-1)
{
//
}

EDIT:

FileStream readStream = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);
BinaryReader read = new BinaryReader(readStream);
Book book = new Book();
 while(read.PeekChar()!=-1)
    {
      book.readDataFrom(read);
      book.display();
    }
...