problem z zapisem do pliku binarnego i odczytem

0

Witam
Otóż mam taki problem mam defincje klasy prostokąt która ma 3 zmienne prywatne to jest bok a, bok b i kolor prostokąta. Mam wczytac z klawiatury do tablicy struktur zestaw danych odnosnie własnie boków i kolorów prostokąta, czyli mam utworzyć tablicę obieków, następnie mam to zapisać do pliku binarnego a nastepnie odczytac z pliku binarnego i wypisać na ekran. Niestety jest problem z zapisem do pliku otrzymuję błąd nieprawidłowy format ciągu wejściowego. No ale format jest prawidłowy bo jest dokładnie tak jak zostało zadeklarowane. Każdy wiersz to jest jeden obiekt, nastpnie na tym pliku beda wykonywane rozne operacje np. znalezienie prostokata o najmiejszym polu albo najwiekszym obwodzie. Poniżej kod

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;

namespace prostokatplik
{
    class Program
    {
        static void Main(string[] args)
        {
            int i, j, licz = 0, lp;
            string nazwa;
            Prostokat[] prost;
             Console.WriteLine("podaj liczbe prostokątow");
            lp = int.Parse(Console.ReadLine());
            prost = new Prostokat[lp];
            for(i=0;i<prost.Length;i++)
            {
                Console.Write("podaj bok a");
                double dA = double.Parse(Console.ReadLine());
                Console.Write("podaj bok b");
                double dB = double.Parse(Console.ReadLine());
                Console.Write("podaj kolor prostokata");
                string strKolor = Console.ReadLine();
                Console.WriteLine();
               prost[i] = new Prostokat(dA, dB, strKolor);
            }
            Console.WriteLine("prezentacja");
            for (i = 0; i < prost.Length; i++)
                Console.WriteLine("{0} {1} {2}",prost[i].GetKolor(),prost[i].GetA(),prost[i].GetB());
            for(i=0;i<lp;i++)
            {
                string linia=Console.ReadLine();
                string[] licze = linia.Split();
                prost[i] = new Prostokat(double.Parse(licze[0]), double.Parse(licze[1]),licze[2]);
            }

            Console.WriteLine("podaj nazwe pliku");
            nazwa = Console.ReadLine();
            BinaryFormatter bf = new BinaryFormatter();
            FileStream fs = new FileStream(nazwa, FileMode.Create);
            bf.Serialize(fs, prost);
            fs.Close();

            fs = new FileStream(nazwa, FileMode.Open);
            while(fs.Position<fs.Length)
            {
                prost[licz] = (Prostokat)bf.Deserialize(fs);
                licz++;
            }
            fs.Close();


            Console.ReadKey();
        }
    }
    [Serializable]
    class Prostokat
    {
        private double m_dA, m_dB;
        private string m_strKolor;
        public Prostokat() { m_dA = 0.0;m_dB = 0.0;m_strKolor = "biel"; }
        public Prostokat(double dA, double dB, string strKolor) { m_dA = dA; m_dB = dB;m_strKolor = strKolor; }
        public void pole()
        {
            double pole;
            pole = m_dA * m_dB;
        }
      public void obwod()
        {
            double obwod = 4 * (m_dB + m_dA);
        }
        public string GetKolor() { return m_strKolor;}
        public double GetA() { return m_dA;}
        public double GetB() { return m_dB; }
        public override string ToString()
        {
            return m_dB + " " + m_dA + " " + m_strKolor;
        }
    }


}
0

Tu masz problem
```csharp
string linia = Console.ReadLine();
string[] licze = linia.Split();
prost[i] = new Prostokat(double.Parse(licze[0]), double.Parse(licze[1]), licze[2]);

chcesz parsować coś co jest puste.
0

a jak zrobić żeby w jednej linii był jeden obiekt ? obiekt z zapisem 3 danych bok a, bok b, kolor ?

0

Ta pętla jest Ci nie potrzebna:

for (i = 0; i < lp; i++)
            {
                string linia = Console.ReadLine();
                string[] licze = linia.Split();
                prost[i] = new Prostokat(double.Parse(licze[0]), double.Parse(licze[1]), licze[2]);
}

A to:

 fs = new FileStream(nazwa, FileMode.Open);
while (fs.Position < fs.Length)
            {
                prost[licz] = (Prostokat)bf.Deserialize(fs);
                licz++;
            }
fs.Close();

Zamień na:

fs = new FileStream(nazwa, FileMode.Open);
prost = (Prostokat[])bf.Deserialize(fs);
fs.Close();

bez while

0

dziękuję za odpowiedź

1 użytkowników online, w tym zalogowanych: 0, gości: 1