Kannst du ein C/C++ Programm für RLE-Kompression bauen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet
#include <iostream>

using namespace std;

int main()
{
   std::string eingabe{"aaaaabbcddddddd"};
   std::string ausgabe{};

   int rle_count = 1;
   int iteration = 0;
   char found = 0;

   for(const char& ch : eingabe)
   {
       // geschuldet der Bedingung "muss eine for each-Schleife sein",
       // die für einen look ahead-ähnlichen Algorithmus Blödsinn ist:
       // Die allererste Iteration wird mehr oder weniger übersprungen,
       // um somit eine Art do{} while() hinzubekommen.
       if(iteration == 0)
       {
           found = ch;
           iteration = 1;
           continue;
       }

       if(ch != found)
       {
           if(rle_count > 1)
           {
               ausgabe = ausgabe + std::to_string(rle_count);
           }

           ausgabe = ausgabe + found;

           found = ch;
           rle_count = 1;
       }
       else
       {
           rle_count++;
       }
   }

   // Die Coderedundanz kann dann in eine Methode ausgelagert werden.   
   if(rle_count > 1)
   {
       ausgabe = ausgabe + std::to_string(rle_count);
   }

   ausgabe = ausgabe + found;

   std::cout << "Ergebnis: " << ausgabe << "\n";

   return 0;
}

Bitte sehr. Been there, done that. War seinerzeit auch Teil der PCX-Kompresssionen.

Deine Bedingungen waren aber nicht das Gelbe vom Ei. Eine For-each ergibt dann Sinn, wenn du die RLE-Anzahl nachstellst. Sonst ist in jedem Fall eine do while() besser, weil du ja eh mindestens das allererste Zeichen brauchst und somit minimal eine Iteration hast.