Dicker Logischer Fehler - ich finde aber keine Lösung



  • Hallo!

    Ich sitze hier gerade vor einem Programm welches eigentlich sehr einfach ist. Dachte ich. Jetzt hänge ich hier vor dem einzigen Fehler finde aber keine Lösung. Ich hoffe mir mag einer helfen.

    Also zu dem Programm:
    Es gibt 2 Dateien mit Datensätzen der Struktur "zahl,name".
    z.B.

    Datei 1 oder auch a:
    1,hans
    3,peter
    4,ulf
    5,ralf
    7,manuel
    9,erik
    11,till
    
    Datei 2 oder auch b:
    2,sabine
    6,petra
    8,susi
    10,berta
    

    Diese sollen nun geordenet nach ihrer Nummer aufsteigend in eine neue Datei (Datei 3 - oder auch c) eingeordnet werden. Wie ihr seht sind die Ausgangsdateien ihrerseits auch schon geordnet.

    Datei 3
    1,hans
    2,sabine
    3,peter
    4,ulf
    5,ralf
    6,petra
    7,manuel
    8,susi
    9,erik
    10,berta
    11,till
    

    Diese Aufgabe hat die Funktion merge:

    void merge(ifstream& a, ifstream& b, ofstream& c){ 
      string buffer_a, buffer_b;
      // Erste Zeilen aus beiden Dateien holen
      getline(a, buffer_a);
      getline(b, buffer_b); 
    
      // nun wird in Abhängigkeit der zahl sortiert,
      // solange bis ein Dateizeiger am Ende ist.
      while (!a.eof() && !b.eof()) {     
        if (buffer_a <= buffer_b) { // Unter Java hätte das nie funktiniert, aber hier kein Problem
          c<<buffer_a<<endl; // Buffer A in Ausgabedatei schreiben
          getline(a, buffer_a); // Nächste Zeile aus A holen
        }
        else{    
          c<<buffer_b<<endl; // Buffer B in Ausgabedatei schreiben
          getline(b, buffer_b); // Nächste Zeile aus B holen
        }
      }
      //##########################################
      // Nun sind buffer_a und buffer_b gefüllt
      // Zum nächsen Schritt wird nun einer der beiden Inhalte verschlampt
      // Hier ist auch der Fehler, ich habe lange rumprobiert mit verschiedenen
      // Abfrage doch noch zu einer korrekten Ausgabe zu kommen, leider vergebens,
      // steh leider auf dem Schlauch
      //##########################################
    
      // Falls eine der beiden Dateien zuende ist, die restlichen Inhalte aus der anderen Datei noch schreiben
      while (!a.eof()){
        c<<buffer_a<<endl; // Buffer A in Ausgabedatei schreiben
        getline(a, buffer_a); // Nächste Zeile aus A holen
      }  
    
      while (!b.eof()){
        c<<buffer_b<<endl; // Buffer B in Ausgabedatei schreiben
        getline(b, buffer_b); // Nächste Zeile aus B holen
      }  
    }
    

    Ich hoffe ihr habt meine Anmerkungen zum Fehler gefunden und könnt mir ohne, dass ihr viel Arbeit habt helfen.

    MFG

    Fabian



  • Ich sehe keinen Fehler.

    Wie manifestiert er sich denn?
    Falls du in der Ausgabedatei leerzeilen haben solltest, dann liegt das daran, dass du Leerzeilen in den Eingabedateien hast (vermutlich am ende). Aber sonst sieht es ok aus...



  • also:
    buffer_b ist gefüllt mit: 10,berta , das Dateiende wurde erreicht.
    Die große Schleife ist vorüber.
    Jetzt wird die schleife mit while(!b.eof()) nicht mehr ausgeführt.
    Nur die !a.eof()
    10,berta erscheint nicht in der Ausgabedatei.
    10,berta müsste jetzt noch unter den restlichen Werten einsortiert werden.

    Gruss
    Fabian



  • hi,

    ist das nicht der typische stream-fehler, dass sobald die letzte zeile gelesen wurde b.eof() wahr ist, und deshalb buffer_b nicht mehr geschrieben wird?



  • Du gehts davon aus, das nach der Schleife
    while (!a.eof() && !b.eof())
    buffer_a und buffer_b nach c geschreiben wurden.
    Dem ist aber nie so. Einer von beiden wurde noch nicht nach c geschreiben!
    leider weist du nicht, welcher!


Anmelden zum Antworten