Laden...

Aufgabe: Flugposition protokollieren

Erstellt von Cariot40 vor 2 Jahren Letzter Beitrag vor 2 Jahren 606 Views
C
Cariot40 Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren
Aufgabe: Flugposition protokollieren

Hallo,
ich bin neu in Foren und hoffe ich mache auch alles richtig hier. Auch als älteres Baujahr möchte ich noch was dazulernen und scheitere gerade an einer ILS-Einsendeaufgabe, zumal die Hefte miserabel geschrieben sind und vermutlich auch noch nie korrigiert/angepasst wurden.
Hier meine Problem-Aufgabe:

  1. Erstellen Sie für diese Einsendeaufgabe ein neues Projekt „ESA_Projekt“, in das Sie den letzten Stand des Fliegerprojekts kopieren. Ergänzen Sie das Projekt durch eine
    Programmierung, mit der die Positionsdaten eines Flugs in einer Datei protokolliert werden können.
    • Die Protokollierungsdatei soll in den Ausführordner des Programms („Release“ oder „Debug“) geschrieben werden
    • Der Name jeder Protokolldatei soll nach dem Muster
    <kennung>_<Tag>-<Stunde>-<Minute>-<Sekunde>.bin
    zusammengesetzt werden. Das lässt sich programmgesteuert erzeugen und unterscheidet mit dieser zeitabhängigen Codierung zuverlässig mehrere Protokolldateien.
    • In die Datei soll zunächst ein String geschrieben werden, der folgende Informationen zusammenfasst:
    Flug "<kennung>" (Typ "<typ>") startet an Position "<x>-<y>-<h>" mit Zielposition "<x>-<y>-<h>".
    Das ist der Header der Protokollierungsdatei, auf den sodann die Daten folgen.

Auch hier sind wieder alle Ausdrücke mit spitzen Klammern durch konkrete Werte aus der Programmierung zu ersetzen.
• In die Datei sollen sodann fortlaufend die x-, y- und h-Daten der aktuellen Position als int-Werte geschrieben werden, bis der Flug beendet ist. Das sind sozusagen
die Daten der Datei.
• Die Protokollierung soll vom Wert eines „Schalters“ abhängig gemacht werden, den Sie in der Klasse Program als static-Variable definieren:
public static bool protokollieren = true;

Wenn dieser Schalter auf true gesetzt ist, wird protokolliert, wenn er auf false gesetzt ist, wird nicht protokolliert.
Bei dieser Aufgabe geht es nicht nur um die technische Realisierung vorgenannter Anforderungen, sondern vor allem um grundlegende Überlegungen objektorientierter
Programmierung. Sie sollten sich z. B., wenn Sie den nötigen Writer deklarieren, klarmachen, dass ein Writer einem Flugschreiber entspricht und
prüfen, welcher Fliegertyp überhaupt einen Flugschreiber nutzen kann. Beispiele für derartige Überlegungen objektorientierter Planung gab es in diesem Heft,
aber auch schon bei der Planung des Projekts im Studienheft CSH01B – z. B. zur Ansiedlung des Transponders.

Auf diesen Überlegungen aufbauend sind dann folgende Fragen zu beantworten:
a) Wo deklarieren Sie das Writer-Objekt, damit es an den Stellen im Programm, an denen es benötigt wird, auch bekannt ist?
b) An welcher Stelle im Programm bauen Sie den Dateipfad zusammen, erstellen den Writer und schreiben den Header?
c) An welcher Stelle im Programm schreiben Sie die Daten der x-, y- und h-Werte?
d) An welcher Stelle im Programm schließen Sie den Writer?
e) Wie stellen Sie jeweils sicher, dass diese Operationen nur dann erfolgen, wenn der „Schalter“ in der Programmklasse auf true gestellt ist?
Geben Sie jeweils den Programmcode an und erläutern Sie kurz Ihre Programmierung.
Hinweis:
BinaryWriter kennt eine Methode
public virtual void Write ( string value )

… die nicht nur den als Parameter anzugebenden String in die Datei schreibt, sondern davor eine Information über die Länge des Strings speichert (vergleichen Sie die
.NET-Dokumentation).
BinaryReader kennt eine spiegelbildliche Methode
public virtual string ReadString ()

… die zunächst die in der Binärdatei gespeicherte Längeninformation auswertet und sodann präzise die Länge des nachfolgenden String liest, sodass der Lesezeiger für
weitere Leseoperationen genau auf das nachfolgende Byte gesetzt wird.

Im Anhang ist mein letzter Versuch die Aufgabe zu lösen, auch hier bin ich wieder gescheitert. Ich wäre dankbar für Eure Unterstützung.

LG Diane

hier zwei Post zum gleichen Thema:
Werte in Datei schreiben
Forumsuche nach "Flugschreiber"

C
Cariot40 Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren

Ach ja, ich will nicht das mir die Aufgabe gelöst wird, sondern Hilfe/Unterstützung damit das Problem/die Probleme die ich habe verständlich gelöst werden....vielleicht habe ich ja nur Verständnisprobleme... 🙂

463 Beiträge seit 2009
vor 2 Jahren

Und was ist deine genaue Frage? Welches Problem hast du genau?

C
Cariot40 Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren

also wo fange ich an:
das Programm läuft soweit, dann erstelle ich im Flugschreiber den Dateipfad


       public void Flugschreiber(string kennung, Position startPos)
        {
            if (Program.protokollieren)
            {
                DateTime timestamp = DateTime.Now;
                string pfad = @".\" + kennung + "_" + timestamp.Day + "-" + timestamp.Hour + "-" + timestamp.Minute + "-" + timestamp.Second + ".bin";
                protokoll = pfad;

                writer = new BinaryWriter(File.Open(pfad, FileMode.Create));
                string header = "Flug \"" + kennung + "\"(Typ " + this.typ + ") startet an Position " + pos.x + "-" + pos.y + "-" + pos.h + " mit Zielposition " + zielPos.x + "-" + zielPos.y + "-" + zielPos.h;
                writer.Write(header);
            }
        }

dieser müsste ja mal angelegt werden was er aber nicht tut....Vorgabe war mit Kennung-Datum Uhrzeit damit komme ich nicht so recht klar, wenn ich Dateien anlege funktioniert das(siehe nachfolgendes Script)


class Program
    {
        ////Datei erstellen
        //public void DateiErstellen(string path, byte[] array)
        //{
        //    FileStream stream = File.Open(path, FileMode.Create);
        //    stream.Write(array, 0, array.Length);
        //    stream.Close();
        //}

        // abgeänderter Code Datei erstellen
        public void DateiErstellen(string path, byte[] array)
        {
            FileStream stream = new FileStream(path, FileMode.Create);
            for(int i = 0; i < array.Length; i++)
            {
                stream.WriteByte(array[i]);
            }
            stream.Close();
        }

        // public override int Read(byte[] array, int offset, int count)

        public void DateiLesen(string path)
        {
            FileStream stream = File.Open(path, FileMode.Open);
            byte[] array = new byte[stream.Length];
            stream.Read(array, 0, (int)stream.Length);
            for(int i = 0; i < array.Length; i++)
            {
                Console.WriteLine((char)array[i]);
            }
            Console.WriteLine();
            stream.Close();
        }

        // int retInt = stream.Read( array, 0, (int)stream.Length );
        // Console.WriteLine( "Read-Rückgabewert = {0}", retInt );
        // public StreamWriter ( Stream stream )
        // FileStream stream = File.Open(pfad, FileMode.Create)
        // StreamWriter writer = new StreamWriter(stream);
        // StreamWriter writer = new StreamWriter(File.Open(pfad, FileMode.Create ));

        public void WriterNutzen(string path, string content)
        {
            StreamWriter writer = new StreamWriter(File.Open(path, FileMode.Create));
            writer.WriteLine(content);
            writer.Close();
        }

        //// 1. Version Reader Nutzen
        //public void ReaderNutzen(string path)
        //{
        //    StreamReader reader = new StreamReader(File.Open(path, FileMode.Open));
        //    string line;
        //    while((line = reader.ReadLine()) != null)
        //    {
        //        Console.WriteLine(line);
        //    }
        //    Console.WriteLine(reader.ReadLine());
        //    reader.Close();
        //}

        public void ReaderNutzen(string path)
        {
            StreamReader reader = new StreamReader(File.Open(path, FileMode.Open));
            int zeichen;
            while ((zeichen = reader.Read()) != -1)
                Console.Write((char)zeichen);
                Console.WriteLine();
                reader.Close();
        }
        public void BinaryWrite(string path, int[] content)
        {
            BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Create));
            for(int i = 0; i < content.Length; i++)
            {
                writer.Write(content[i]);
            }
            writer.Close();
        }

        //// 1.Version Binary Reader
        //public void BinaryRead(string path)
        //{
        //    BinaryReader reader = new BinaryReader(File.Open(path, FileMode.Open));
        //    //for(int i = 0; i < 3; i++)
        //    bool goOn = true;
        //    while(goOn)
        //    {
        //        try
        //        {
        //            Console.WriteLine("{0} ", reader.ReadInt32());
        //        }
        //        catch(EndOfStreamException e)
        //        {
        //            goOn = false;
        //        }                
        //    }
        //    reader.Close();
        //    Console.WriteLine();
        //}
        public void BinaryRead(string pfad)
        {
            BinaryReader reader = null;
            try
            {
                reader = new BinaryReader(File.Open(pfad, FileMode.Open));
            }
            catch (FileNotFoundException e)
            {
                Console.WriteLine("Die Datei \"{0}\" wurde nicht gefunden.", pfad);
            return;
            }
            bool goOn = true;
            // etc.
        }


        static void Main(string[] args)
        {
            Program test = new Program();
            string path = @"D:\GANZ_NEU\Projekte\Musterdatei.bin";
            int[] pos = { 1400, 3250, 280 };
            test.BinaryWrite(path, pos);

            //string path = @"D:\GANZ_NEU\Projekte\Musterdatei.txt";
            //string content = @"Dieser Text wird Inhalt der Datei.
            //Er enthält Zeilenumbrüche und eine Pfadangabe: 
            //D:\GANZ_NEU\Projekte\Musterdatei.txt";
            //byte[] array = { 68, 97, 116, 101, 105 };
            // Reader und Writer
            //test.WriterNutzen(path, content);
            //test.ReaderNutzen(path);

            //DateiErstellen
            //test.DateiErstellen(path, array);

            // Datei lesen
            //test.DateiLesen(path);

            Console.ReadKey();
        }
    }

4.939 Beiträge seit 2008
vor 2 Jahren

Vergleiche mal die Methode mit der Methode BinaryWrite (bes. die letzte Zeile).

Noch besser wäre jedoch die Verwendung der using-Anweisung, damit beim Blockende automatisch ein Dispose() (bzw. Close()) ausgeführt wird:


using (var writer = new BinaryWriter(...))
{
    // ...
}

C
Cariot40 Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren

das habe ich jetzt versucht, aber leider schreibt das Programm immer noch nicht...ich dachte auch wenn keine Positionsdaten, dann müsste doch mindestens eine Datei erstellt werden mit dem Header ? im Verzeichnis Debug - Flug<Kennung>Uhrzeit-.bin mit dem Header LH 500-Position: 3500-1400-180 Zieldistanz: 2657 m aber dem ist nicht so, also fehlt sicher doch ein Detail (StreamReader - StreamWriter?)

Das obige Beispiel funktioniert ja, aber im File Programm.cs nicht 😦

D
152 Beiträge seit 2013
vor 2 Jahren

Du öffnest die Datei mit einen relativen Pfad und dieser muss halt nicht der sein wo die exe liegt.

Das aktuelle Verzeichnis kann mit Directory.GetCurrentDirectory Methode ermittelt werden.

Ich bin mit jetzt auch nicht ganz sicher, aber ich meine wenn das Programm aus Visual Studio gestartet wird ist das aktuelle Verzeichnis in dem die Projektdatei liegt.

C
Cariot40 Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren

das ist richtig, die Datei sollte auch ins Debug Verzeichnis schreiben, das war der Plan...aber du hast mich auf die Idee gebracht mal zu schauen ob es an Berechtigungen liegt....aber auch in einem anderen Verzeichnis legt er keine Datei an...ich habe aber durch diese Anregung noch ein paar Ideen, aus der Aufgabe die ich gepostet habe..
Hinweis, die Aufgabenstellung bezieht sich auf die angehängte Datei aus meinem Post mit der Fragestellung....

Mein Programm läuft, aber ich habe einen Flugschreiber darin zu implementieren, was ich mit BinaryWriter machen soll, aber mein Ansatz (ist in der Datei Program.cs) funktioniert nicht...ich verstehe das nicht, weil ich das ganze noch am lernen bin, aber ich muss leider auf Erklärbären(Lehrer/Dozenten) verzichten, kenne niemanden der sich das Script mal anschauen und bewerten kann, somit bin ich auf Hilfe in Foren angewiesen, die mir das nicht lösen, sondern mit Fragestellungen, Ansätzen Ideen die Möglichkeit gibt das Rätsel selber zu lösen, und gegebenenfalls weitere Fragen mit Erklärungen (warum, wieso, weshalb) auf den AHA-Effekt stoßen 🙂

T
2.224 Beiträge seit 2008
vor 2 Jahren

Ist den sichergestellt, dass Program.protokollieren true ist?
Falls nicht, wird der ganze Block übersprungen, dann kann auch nichts geloggt werden.
Solltest du im einfachsten Fall per debugger prüfen können.

Du hast aber mit dem BinaryWriter noch ein anderes Problem.
Du öffnest die Datei mit FileMode.Create, was dazu führt, dass die Datei bei vorhanden sein an Position 0 also am Anfang geöffnet wird.

Damit schreibst du aktuell den Header immer an den Anfang der Datei.
Wenn du dies mit den späteren Logdaten genau so machst, dann würdest du alle Daten immer wieder an den Anfang der Datei schreiben.
Die Datei muss dann mit Append geöffnet werden.
Dann werden weitere Einträge an das Ende der Datei geschrieben.
Nur sollte dann der Header vermutlich nur einmalig geschrieben werden.
Musst du dann in deinem Programm anpassen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.939 Beiträge seit 2008
vor 2 Jahren

Wird überhaupt die Methode Flugschreiber(...) aufgerufen? In deiner angehängten Datei jedenfalls nicht.

Du solltest dringend lernen, mit dem Debugger umzugehen: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

C
Cariot40 Themenstarter:in
6 Beiträge seit 2021
vor 2 Jahren

ääähm, ja, da ist mir was durchgerutscht, ich poste das script mal neu...es sollte ja sauber sein was ich mir dann "dokumentiere" aber ehrlich gesagt das projekt mache ich gerade zum 50. Mal (ausgesetzt wegen Krankheit, wieder neu gemacht, dann zuviel Arbeit, wieder neu gemacht and so on...ich will einfach diese Aufgaben mal lösen, und dabei ne menge lernen) 🙂
Danke für den Hinweis