Frage zu folgendem Code - Zeiger richtig positionieren



  • Hi Leuts,
    hab mir ein Programm, mit dem man beliebig viele Zahlen eingeben kann und anschließend wieder ausgeben. Beim Beenden werden die Zahlen gespeichert und beim erneuten wieder eingelesen. Nun möchte ich es so ändern, das man die Liste beim erneuten Einlesen der alten Zahlen erweitern kann. Jedoch speichert es mir immer nur die aktuellen Zahlen - die alten gehen irgendwie verloren?

    Wie muss ich das umschreiben?

    #include <iostream>
    #include <conio.h>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
        struct Memory
        {
            float value; 
            Memory* next;
        };
    
        Memory* currentMemory;
    
        Memory* lastMemory=0;
        Memory* start=0;
    
        ifstream inputFile("Zahlen.dat"); 
        istream* inputStream; 
        if(inputFile)
        {
            cout << "File has been found - using it as input" << endl;
            inputStream=&inputFile;
            inputStream=&cin;
        }
        else
        {
            cout << "No file has been found - please enter some numbers, end with 0" << endl;
            inputStream=&cin;
        }
    
        while(true)
        {
            cout << "Input : ";
    
            float value=0; 
            (*inputStream) >> value;
    
            if(value==0)
            {
                break;
            }
    
            currentMemory=start; 
            while(currentMemory!=0
            {
                if(currentMemory->value==value)
                {
                    break;
                }
    
                currentMemory = currentMemory->next;
            }
    
            if(currentMemory==0) 
            {
                currentMemory=new Memory;
                if(start==0)
                {
                    start=currentMemory;
                }
                if(lastMemory!=0)
                {
                    lastMemory->next=currentMemory;
                }
    
                currentMemory->value=value;
                currentMemory->next=0; 
    
                lastMemory=currentMemory;
            }
            else
            {
                cout << "The number " << value << " has already been in the list - skipping it" << endl;
            }
        }
        cout << endl << endl << "Output :" << endl << endl ;
        currentMemory=start; 
        while(currentMemory!=0) 
        {
            cout << (currentMemory->value) << endl;
            currentMemory = currentMemory->next;
        }
    
        cout << "Saving the list to a file" << endl;
        {  
    	    ofstream outputFile("Zahlen.dat", ios::trunc); 
    (ios::trunc makes the file empty). using .txt extension, so that it can be easily opened with a text editor.
            currentMemory=start; 
            while(currentMemory!=0) 
            {
                outputFile << (currentMemory->value) << endl;
                currentMemory = currentMemory->next;
            }
        }
        getch();
    }
    

    mfg
    martin



  • Abgesehen davon, dass das so gar nicht funktionieren kann und du den Speicher nicht mehr freigibst, solltest du, wenn du die Standardbibliothek nutzt, auch den Rest (std::list usw) nutzen.

    Aber egal. Wenn du doch die Zahlen einliest, kannst du die doch auf die gleiche weise abspeicher, wie die anderen Zahlen, die du vom User einliest. Dann liest du die so ein und behandelst die dann einfach, alsob die der User eingegeben hat.



  • Hi

    Verstehe ich das richtig: Du hast eine verkettete liste mit zahlen. Jedoch setzt du jedes mal :

    currentMemory=start;

    Folglich fängst du im input immer bei position 0 an und überschreibst die liste?

    Grüße



  • Das scheint das Problem zu sein, Bloop. Ne Idee, wie ichs abändern könnte?

    mfg



  • Hmm, scheint wirklich knifflig zu sein. Das schaff ich nie, wenns hier schon keiner zu Wissen scheint. 😞



  • Metler schrieb:

    Hmm, scheint wirklich knifflig zu sein. Das schaff ich nie, wenns hier schon keiner zu Wissen scheint. 😞

    Hmm. Es hat nicht jeder Lust deinen unstrukturierten Ansatz zu verstehen zu versuchen.
    Wie wäre es mit einer Klasse, mit der du deine Liste verwaltest? Und die Liste von der Ein/Ausgabe trennst? Das würde die Sache enorm vereinfachen und man hätte auch einen besseren Überblick, was du eigentlich gedenkst zu tun.
    Im übrigen hat Bloop ja einen Hinweis gegeben. Das Problem gäbe es nicht, wenn du eine anständige Klasse geschrieben hättest, anstatt einfach mal drauflos zu schreiben.

    Am besten du lässt einfach mal die Ein/Ausgabe weg und konzentrierst dich darauf eine Klasse zu schreiben, die einfache Funktionen, wie ein Element anfügen oder eines löschen anbietet. Dann kommst du gar nicht auf solche Probleme, die lediglich mit der Struktur deines Programmes zu tun haben.

    Wenn du dann deine Liste hast, kannst du das ganz einfach machen. (Pseudocode)

    MyList list; //Liste erzeugen
    
    int val;
    while (ifstream >> val) // aus der Datei lesen und in val speichern
         list.push_back (val); //und jetzt in die Liste einfügen
    
    while (istream >> val) //jetzt die usereingaben abwarten
         list.push_back (val); //und wieder speichern
    
    //Ausgeben
    
    //Speichern
    


  • Geheimtipp: Verwende einen Debugger


Anmelden zum Antworten