Wie verwende ich BinaryReader in einer Schleife, damit ich Informationsblöcke im richtigen Format anzeigen kann?

StackOverflow https://stackoverflow.com/questions/7830908

  •  27-10-2019
  •  | 
  •  

Frage

Ich mache Hausaufgaben und bin zu dem Teil gekommen, an dem ich meine Daten aus der Datendatei anzeigen muss. Das Problem ist, dass ich einzelne Daten mit BinaryReader () anzeigen kann, aber keine korrekte Schleife erstellen kann, in der alle Daten in dem unten angegebenen Format angezeigt werden:

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

Stattdessen zeige ich nur den letzten Eintrag. Sehen Sie das Problem? Ich weiß nicht, wie ich alle Daten aus dem Datenordner mithilfe einer Schleife anzeigen soll.

Ich freue mich über Tipps, wie dies getan werden kann.

Danke!

Hier sind meine Codedateien:

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

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

Vielen Dank für jede Hilfe.

Grüße.

HelpNeeder.

- BEARBEITEN -

Funktioniert! Vielen Dank!

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

Außerdem musste ich sicherstellen, dass jedes Mal, wenn ich das Programm ausführte, eine neue Datei erstellt wird!

Außerdem muss ich sicherstellen, dass ich meine FileStreams schließe, da das Programm immer wieder abstürzt.

War es hilfreich?

Lösung

Sie vergessen, eine Schleife durchzuführen.book.display zeigt nur ein Buch.Sie vergessen auch, Daten für das Buch einzulesen.

Sie können überprüfen, ob die Datei mehr Daten enthält, indem Sie einen Blick darauf werfen.Wenn peek -1 zurückgibt, wissen Sie, dass dies der Fall istkeine Daten mehr.

Beispiel:

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

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

Andere Tipps

Verwenden Sie binaryReader.PeekChar () Methode.

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

BEARBEITEN:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top