#c# #methods #binaryreader #binarywriter
#c# #методы #binaryreader #binarywriter
Вопрос:
Я работаю над домашним заданием, и я полностью застрял! То, что я пытаюсь сделать, это использовать уже определенный ввод и сохранить его в файл с помощью метода saveDataTo() и прочитать ввод с помощью метода readDataFrom() .
Я застрял на первой части. Я не уверен, нужно ли сначала инициализировать данные в файле Program.cs?
Я не знаю, и я застрял. Вот код и надеюсь на несколько советов, как я могу это сделать.
— РЕДАКТИРОВАТЬ —
Я могу добавить инструкции для использования методов saveDataTo() и readDataFrom():
Метод saveDataTo( ) принимает параметр BinaryWriter . Метод записывает значения всех 5 свойств объекта book в поток файлов, связанный с writer (ассоциация выполняется в методе Main( ) класса Program). В этом методе нет необходимости открывать и закрывать файловый поток и двоичную запись.
Метод readDataFrom( ) принимает параметр BinaryReader . Метод считывает значения всех пяти свойств объекта Book из потока файлов, связанного с reader (ассоциация выполняется в методе 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();
}
}
}
Публикация.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);
}
}
}
С уважением.
Помощь.
Ответ №1:
Вы спрашиваете, определять ли значения в Program.cs или Book.cs, верно? Ну, можно определить значения в Program.cs, вам просто нужно убедиться, что все значения указаны перед записью данных.
Итак, поскольку функция принимает параметр BinaryWriter, который предположительно инициализирован заранее, это должно сработать:
public void saveDataTo(BinaryWriter w)
{
w.Write(getAuthorName());
//etc...
}
Но просто помните, что вам нужно определить всю информацию где-нибудь (где угодно) перед вызовом save data .
Комментарии:
1. Хорошо, я думал, что это будет что-то вроде этого. Должен ли я добавить что-то в Main(), чтобы BinaryReader() знал FileStream?
2. Посмотрите на строку 47 в Program.cs, в ней нет необходимости?
3. Строка 47 — это какая? Тот, в котором вы настраиваете новый BinaryWriter?
4. Я добавил строку комментария прямо перед этим, извините, это не строка 47. Это в program.cs части.
5. Вам нужно объявить новый BinaryWriter, чтобы функция saveDateTo() действительно могла записывать данные во что-то.
Ответ №2:
Вы назначаете свои параметры 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)
Редактировать
Теперь при повторном вводе отображается цена, поскольку вы записываете ее как плавающее поле (или double, не вижу определения) и считываете его как целое число.
Измените с r.ReadInt32(); на r.ReadDouble(); или r.ReadSingle()
Комментарии:
1. О! Хорошо! Я знаю, о чем вы говорите. Поскольку я наследую параметры, я должен использовать объект book вместо публикации. Отлично, он компилируется. Я отправлю больше вопросов, если у меня будет больше проблем.
2. Один комментарий к соглашению об именовании методов. Мой профессор настаивает на том, чтобы мы использовали верблюжий регистр для методов и классов с заглавными буквами.
3. ваш профессор действительно учит вас плохой практике… Не то чтобы я знал, что лучше, но я твердо верю, что важно соблюдать отраслевой стандарт, и, кроме того, вы, как разработчик, должны быть тем, кто решает, как он пишет свой код
4. Обновил мой ответ, чтобы ответить на ваш второй вопрос. Теперь о вашем учителе (оффтопик). Если вы думаете, что можете улучшить чью-то работу, даже если это сам Джон Скит, тогда попробуйте это сделать!
5. Ну, если это значение с плавающей запятой, то единственное изменение, которое вам нужно внести, — это readDataFrom в первой строке с «Price = r.ReadIn32();» на «Price = r.ReadSingle();»