Wie Klasse optimieren? Update:Klasse komplett, paar Fehler n

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wie Klasse optimieren? Update:Klasse komplett, paar Fehler n

    Hallo,

    ich habe eine Klasse geschrieben welche eine Textdatei ausliest und die Strings zeilenweise in einen Stringvector legt. Auf diesen Stringvector sollen nun verschiedene Funktionen zugreifen können:

    void viewline():

    Soll bestimmte Zeilen anzeigen lassen, arbeitet ok.


    void removeline()

    Soll bestimmte Zeilen löschen, durch das mehrmalige Durchlaufen der for-Schleife "rutschen" die Elemente nach und so ist das Ergebnis nicht mehr das gewünschte, wie könnte ich das optimieren?


    void addline()

    Soll Zeilen am Ende des Vector anfügen... leider klappt das auch hier nur sporadisch, und ich weiß nicht nach welchem Prinzip (Zeilen werden unvollständig oder gar nicht in den Stingvector anfgefügt). Wo ist hier die Inkonsistenz?

    allgemein: wie kann ich eine bessere Abruch-Bedingung schreiben? bei den ersten beiden Funktionen soll man mit Enter die Texteingabe beenden.

    Hier nun der Code meiner Klasse:

    Quellcode

    1. #include "AsciiEditor.h"
    2. #include <fstream>
    3. #include <iostream>
    4. #include <vector>
    5. #include <string>
    6. #include <iterator>
    7. class Editor
    8. {
    9. public:
    10. typedef std::vector<std::string> linevector;
    11. //Textdatei einelesen
    12. void einlesen()
    13. {
    14. std::ifstream ifs("C:/asci1.txt");
    15. std::string tmp;
    16. linevector::iterator li; //LineIterator
    17. while(getline(ifs, tmp))
    18. {
    19. lv.push_back(tmp);
    20. tmp = std::string();
    21. }
    22. }
    23. //Bestimmte Zeilen ansehen
    24. void viewline()
    25. {
    26. typedef std::vector<int> intvector;
    27. intvector intv;
    28. intvector::const_iterator inti;
    29. std::cout<<"Welche Zeilen sollen ausgegeebn werden?: \n\n";
    30. int eingabe;
    31. while (std::cin >> eingabe && eingabe != 999 )
    32. {
    33. intv.push_back(eingabe);
    34. }
    35. linevector::iterator li;
    36. for (inti=intv.begin(); inti!=intv.end(); inti++)
    37. {
    38. li = lv.begin() + *inti; //li LineIterator, lv Linevector von außen
    39. std::cout << *li << std::endl;
    40. }
    41. }
    42. //Bestimmte Zeilen entfernen
    43. void removeline()
    44. {
    45. typedef std::vector<int> intvector;
    46. intvector intv;
    47. intvector::const_iterator inti;
    48. std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
    49. int eingabe;
    50. while (std::cin >> eingabe && eingabe != 999 )
    51. {
    52. intv.push_back(eingabe);
    53. }
    54. linevector::iterator li;
    55. for (inti=intv.begin(); inti!=intv.end(); inti++)
    56. {
    57. li = lv.begin() + *inti; //li LineIterator, lv Linevector von außen
    58. lv.erase(li);
    59. }
    60. for (li=lv.begin(); li!=lv.end(); li++)
    61. {
    62. std::cout << *li << std::endl;
    63. }
    64. }
    65. //Zeilen hinzufügen
    66. void addline()
    67. {
    68. std::cout<<"Zeilen hinzufuegen: \n\n";
    69. std::string eingabe;
    70. std::string tmp;
    71. while(getline(std::cin >> eingabe, tmp)&& eingabe != "end!")
    72. {
    73. lv.push_back(tmp); //lv Linevector von außen
    74. tmp = std::string();
    75. }
    76. linevector::iterator li;
    77. for (li=lv.begin(); li!=lv.end(); li++)
    78. {
    79. std::cout << *li << std::endl; //li LineIterator, lv Linevector von außen
    80. }
    81. }
    82. private:
    83. linevector lv; //Linevector
    84. };
    85. int main(){
    86. Editor edit;
    87. edit.einlesen();
    88. edit.viewline();
    89. edit.removeline();
    90. edit.addline();
    91. return 0;
    92. }
    Alles anzeigen


    Ich würde mich echt freuen wenn ihr nen paar (oder alle?) meiner Fragen beantworten könnt..

    vielen Dank schonmal und viele Grüße...

    Julia :P
  • Hallo Julia,
    für removeline bietet es sich an die zu löschenden Indexe in nem set zu speichern weil sie darin dann sortiert vorliegen.Oder du sortierst halt den vector :wink: .
    Auf jeden Fall kannst du dann mit dem größten Lineindex anfangen und dich dann zum kleinsten vorarbeiten.
    Ohne es jetzt großartig getestet zu haben:

    Quellcode

    1. //Bestimmte Zeilen entfernen
    2. void removeline()
    3. {
    4. typedef std::set<int> index_set;
    5. index_set indexes;
    6. std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
    7. int eingabe;
    8. while (std::cin >> eingabe && eingabe != 999 )
    9. indexes.insert(eingabe);
    10. linevector::iterator li;
    11. index_set::const_reverse_iterator idx_rit;
    12. for (idx_rit=indexes.rbegin(); idx_rit!=indexes.rend(); ++idx_rit)
    13. {
    14. li = lv.begin() + *idx_rit; //li LineIterator, lv Linevector von außen
    15. lv.erase(li);
    16. }
    17. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    18. }
    19. //Zeilen hinzufügen
    20. void addline()
    21. {
    22. std::cout<<"Zeilen hinzufuegen: \n\n";
    23. std::string eingabe;
    24. while(std::getline(std::cin,eingabe)&& eingabe != "end!")
    25. lv.push_back(eingabe); //lv Linevector von außen
    26. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    27. }
    Alles anzeigen

    Generell solltest du in deinem Programm darauf achten ob die eingegebenen Indexe kleiner als lv.size() sind.

    Edit:Sehe gerade dass du noch mehr Fragen hattest....naja,morgen ist ja auch noch nen Tag :) :wink:

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • hey void :)

    danke für deine Hilfle.. es funktioniert auf jeden Fall schon beser :)

    Ich hab nun auch die Abfrage nach der Größe mit eingebaut...

    Das Ding.. wenn ich zB "1 2 3 4 5 6 7" zum löschen angebe und dann mit 999 die Abbruchbedingung erfülle zeigt er gar nichts mehr an :( Woran liegt? Und wie kann ich Enter als Abbruchbedingung festlegen? Hab schon mit /n rumprobiert..

    Quellcode

    1. //Bestimmte Zeilen entfernen
    2. void removeline()
    3. {
    4. typedef std::set<int> index_set;
    5. index_set indexes;
    6. std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
    7. int eingabe;
    8. const unsigned int lvsize = lv.size();
    9. while (std::cin >> eingabe && eingabe != 999 ){
    10. if (eingabe > lvsize)
    11. {
    12. std::cout<< eingabe << " liegt ausserhalb des Bildes ";
    13. }
    14. indexes.insert(eingabe);
    15. linevector::iterator li;
    16. index_set::const_reverse_iterator idx_rit;
    17. for (idx_rit=indexes.rbegin(); idx_rit!=indexes.rend(); ++idx_rit)
    18. {
    19. li = lv.begin() + *idx_rit; //li LineIterator, lv Linevector von außen
    20. lv.erase(li);
    21. }
    22. }
    23. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    24. }
    Alles anzeigen
    Forza Italia!!!!!!
  • Hi,
    wie soll die Eingabe denn generell aussehen?
    Möchtest du für jeden Wert mit return abschliessen oder alle Indexe in einer Zeile,durch Whitespaces getrennt,angeben?
    Hier ist jetzt mal ne aufgebohrte Version die die meisten Fehlerfälle abfängt.
    Der Hilfsfunktion get_indexes wird als zweiter Parameter nen boolscher Wert übergeben mit dem du steuern kannst ob die Werte einzeln(jeder mit return abgeschlossen) oder durch Whitespaces getrennt in einer Zeile eingelesen werden sollen.
    Die unterschiedlichen Anwendungen siehst du in viewline und removeline

    Quellcode

    1. #include <fstream>
    2. #include <iostream>
    3. #include <vector>
    4. #include <string>
    5. #include <iterator>
    6. #include <set>
    7. #include <sstream>
    8. class Editor
    9. {
    10. public:
    11. typedef std::vector<std::string> linevector;
    12. //Textdatei einelesen
    13. void einlesen()
    14. {
    15. std::ifstream ifs("C:/asci1.txt");
    16. std::string tmp;
    17. linevector::iterator li; //LineIterator
    18. while(getline(ifs, tmp))
    19. {
    20. lv.push_back(tmp);
    21. tmp = std::string();
    22. }
    23. }
    24. //Bestimmte Zeilen ansehen
    25. void viewline()
    26. {
    27. typedef std::vector<size_t> intvector;
    28. intvector intv;
    29. intvector::const_iterator inti;
    30. std::cout<<"Welche Zeilen sollen ausgegeebn werden?: \n\n";
    31. get_indexes(intv);
    32. linevector::iterator li;
    33. for (inti=intv.begin(); inti!=intv.end(); inti++)
    34. {
    35. li = lv.begin() + *inti; //li LineIterator, lv Linevector von außen
    36. std::cout << *li << std::endl;
    37. }
    38. }
    39. //Bestimmte Zeilen entfernen
    40. void removeline()
    41. {
    42. typedef std::set<size_t> index_set;
    43. index_set indexes;
    44. std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
    45. while (get_indexes(indexes,true));
    46. linevector::iterator li;
    47. index_set::const_reverse_iterator idx_rit;
    48. for (idx_rit=indexes.rbegin(); idx_rit!=indexes.rend(); ++idx_rit)
    49. {
    50. li = lv.begin() + *idx_rit; //li LineIterator, lv Linevector von außen
    51. lv.erase(li);
    52. }
    53. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    54. }
    55. //Zeilen hinzufügen
    56. void addline()
    57. {
    58. std::cout<<"Zeilen hinzufuegen: \n\n";
    59. std::string eingabe;
    60. std::cin.ignore(std::cin.rdbuf()->in_avail());
    61. do
    62. {
    63. std::getline(std::cin,eingabe);
    64. if(eingabe!="")
    65. lv.push_back(eingabe); //lv Linevector von außen
    66. else
    67. break;
    68. }while(std::cin.good());
    69. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    70. }
    71. private:
    72. linevector lv; //Linevector
    73. //Hilfsfunktion
    74. template<class container_type>
    75. bool get_indexes(container_type& int_container,bool single_values = false)
    76. {
    77. std::string str;
    78. std::getline(std::cin,str);
    79. if(str =="")
    80. return false;
    81. else
    82. {
    83. container_type::value_type tmp;
    84. std::istringstream isstr(str);
    85. if(!single_values)
    86. {
    87. do
    88. {
    89. isstr>>tmp;
    90. if(isstr && tmp<lv.size())
    91. int_container.insert(int_container.end(),tmp);
    92. else
    93. return false;
    94. }while(isstr);
    95. }
    96. else
    97. {
    98. isstr>>tmp;
    99. if(isstr && tmp<lv.size())
    100. int_container.insert(int_container.end(),tmp);
    101. else
    102. return false;
    103. }
    104. return true;
    105. }
    106. }
    107. };
    108. int main(){
    109. Editor edit;
    110. edit.einlesen();
    111. edit.viewline();
    112. edit.removeline();
    113. edit.addline();
    114. return 0;
    115. }
    Alles anzeigen

    Schau dir den Code halt mal an und bei Unklarheiten kannst du ja nachfragen. :wink:

    Ach ja,addline hab ich auch noch abgeändert.Die Version von heute Nacht hat nicht korrekt gearbeitet :oops: .

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • hey cool.. danke :) bin am studieren... also die eingaben sollen mit enter abgeschlossen werden.. außer bei addline()... da am besten durch ein wort oder so.. aber dass bekomme ich auch hin... nur templates hatten wir noch nicht.. ich gucke ob ichs trotzdem verstehe...

    aber auf jeden fall echt vielen dank.. ist mir ne superhilfe.. hab damit fast alles geschafft.. ich bastle grad noch an nem Rahmen für alles.. und dafür versuche ich den längsten String zu finden.. wenn ich soweit bein poste ich es nochmal.. bis denne... :)
    Forza Italia!!!!!!
  • Alle Funktionen sind nun implementiert, jedoch gibt es noch ein paar kleine Probleme die ich nicht behoben kann. Und in ein paar Tagen ist Abgabetermin für die Uni (ihr kennt das ja^^)

    Würde mich freuen wenn ihr ein paar (oder alle) Probleme rausbekommt.. und bitte nicht zu kompliziert, keine Templates (auch wenn es besser ist, aber die hatten wir noch nicht - sorry für deine Arbeit void :( ).. Hauptsache es läuft fehlerfrei...

    Die Probleme habe ich an die Stellen in den Quelltext geschrieben... :

    Quellcode

    1. #include "AsciiEditor.h"
    2. #include <fstream>
    3. #include <iostream>
    4. #include <vector>
    5. #include <string>
    6. #include <iterator>
    7. #include <set>
    8. class Editor
    9. {
    10. public:
    11. typedef std::vector<std::string> linevector;
    12. typedef std::set<int> stringset;
    13. unsigned int col;
    14. //Textdatei einelesen
    15. void einlesen()
    16. {
    17. /*Hier fehlt noch manuelle Angabe des Pfads oder Beispieldatei
    18. Auswahl: 1 -> pfad (ifs(pfad) oder 2 Beispiel-Datei*/
    19. std::cout <<"Ascii-Bild waehlen: Pfad angeben (1) oder Beispiel(2)";
    20. /* klappt leider nicht
    21. int wahl;
    22. std::cin >> wahl;
    23. if (wahl == 2){std::ifstream ifs("C:/asci1.txt");}
    24. if (wahl == 1){/*anuelle Pfadangabe}
    25. {std::cout << "Keine gueltige Auswahl";}
    26. */
    27. std::ifstream ifs("C:/asci1.txt");
    28. std::string tmp;
    29. linevector::iterator li; //LineIterator
    30. stringset maxstring;
    31. while(getline(ifs, tmp))
    32. {
    33. maxstring.insert(tmp.size());
    34. lv.push_back(tmp);
    35. tmp = std::string();
    36. }
    37. stringset::const_reverse_iterator aa;
    38. aa = maxstring.rbegin();
    39. col = *aa;
    40. for (li=lv.begin(); li!=lv.end(); li++)
    41. {
    42. std::cout << *li << std::endl;
    43. }
    44. }
    45. //Bestimmte Zeilen ansehen
    46. //Statt 999 besser "Enter" als Abbruchbedinung
    47. void viewline()
    48. {
    49. typedef std::vector<int> intvector;
    50. intvector intv;
    51. intvector::const_iterator inti;
    52. std::cout<<"Welche Zeilen sollen ausgegeebn werden?: \n\n";
    53. int eingabe;
    54. while (std::cin >> eingabe && eingabe != 999)
    55. {
    56. intv.push_back(eingabe);
    57. }
    58. linevector::iterator li;
    59. for (inti=intv.begin(); inti!=intv.end(); inti++)
    60. {
    61. li = lv.begin() + *inti; //li LineIterator, lv Linevector von außen
    62. std::cout << *li << std::endl;
    63. }
    64. }
    65. //Bestimmte Zeilen entfernen
    66. //Statt 999 besser "Enter" als Abbruchbedinung
    67. void removeline()
    68. {
    69. typedef std::set<int> index_set;
    70. index_set indexes;
    71. std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
    72. int eingabe;
    73. const unsigned int lvsize = lv.size();
    74. while (std::cin >> eingabe && eingabe != 999 ){
    75. if (eingabe > lvsize)
    76. {
    77. std::cout<< eingabe << " liegt ausserhalb des Bildes ";
    78. }
    79. indexes.insert(eingabe);
    80. linevector::iterator li;
    81. index_set::const_reverse_iterator idx_rit;
    82. for (idx_rit=indexes.rbegin(); idx_rit!=indexes.rend(); ++idx_rit)
    83. {
    84. li = lv.begin() + *idx_rit; //li LineIterator, lv Linevector von außen
    85. lv.erase(li);
    86. }
    87. }
    88. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    89. }
    90. //Zeilen hinzufügen
    91. //Problem: Fügt das erste Wort eine Zeile nicht ein
    92. void addline()
    93. {
    94. std::cout<<"Zeilen hinzufuegen: \n\n";
    95. std::string eingabe;
    96. std::string tmp;
    97. while(getline(std::cin >> eingabe, tmp)&& eingabe != "end!")
    98. {
    99. if(eingabe.size() > col)
    100. {
    101. std::cout << "Zeile muss kleiner als " << col << " sein!";
    102. break;
    103. }
    104. lv.push_back(tmp); //lv Linevector von außen
    105. tmp = std::string();
    106. }
    107. linevector::iterator li;
    108. for (li=lv.begin(); li!=lv.end(); li++)
    109. {
    110. std::cout << *li << std::endl; //li LineIterator, lv Linevector von außen
    111. }
    112. }
    113. //Rahmen zeigen -> OK
    114. void showline()
    115. {
    116. std::cout << "Symbol fuer Rahmen angeben: ";
    117. char symbol;
    118. std::cin >> symbol;
    119. std::string empty(col, ' ');
    120. std::string full(col + 4, symbol);
    121. std::cout << full << std::endl;
    122. std::cout << symbol << ' ' << empty << ' '<< symbol << std::endl;
    123. linevector::iterator li;
    124. for (li=lv.begin(); li!=lv.end(); ++li)
    125. {
    126. std::string max = *li;
    127. if(max.size() == col){
    128. std::cout << symbol << " " << *li << " " << symbol << std::endl;
    129. }
    130. else{
    131. unsigned int dif = col - max.size();
    132. std::string fill(dif, ' ');
    133. std::cout << symbol << " " << *li << fill << " " << symbol;
    134. }
    135. }
    136. std::cout << "\n" << symbol << ' ' << empty << ' '<< symbol << std::endl;
    137. std::cout << full << std::endl;
    138. }
    139. //Infos anzeigen lassen -> OK
    140. void infoline()
    141. {
    142. std::cout << "\nDas Ascii-Bild hat " << lv.size() <<" Zeilen und maximal " << col << " Spalten (ohne Rahmen).\n";
    143. }
    144. private:
    145. linevector lv; //Linevector
    146. stringset maxstring;
    147. };
    148. int main(){
    149. /*Sollte nur einmal edit.einlesen aufrufen, aber durch den main()-Aurufen
    150. weiter unten wird sie auch immer wieder neu geladen, ich weiß nicht wie ich
    151. die anderen Funktionen speriert aufrufen kann*/
    152. /*Sollte noch eine Exit-Funktion bzw. neues AsciiLaden-Funktion bekommen*/
    153. Editor edit;
    154. edit.einlesen();
    155. std::cout<<"\nWas wollen sie machen?\n"<<
    156. "Zeilen ansehen (1)?\nZeilen hinzufuegen (2)?\nZeilen entfernen (3)?\nZeileninfos anzeigen (4)?\nRahmen gestalten (5)\n\n";
    157. int wahl;
    158. std::cin >> wahl;
    159. switch(wahl)
    160. {
    161. case 1:edit.viewline();break;
    162. case 3:edit.removeline();break;
    163. case 2:edit.addline();break;
    164. case 5:edit.showline();break;
    165. case 4:edit.infoline();break;
    166. default: std::cout << "Zahl nicht guelting\n";
    167. }
    168. main();
    169. return 0;
    170. }
    Alles anzeigen
    Forza Italia!!!!!!
  • Hi Julia,
    hier ist schonmal der aktuelle Code(ohne templates).
    Dafür hab ich aber in removeline std::set durch nen vector ersetzt den ich mit sort sortiere um den gleichen Effekt zu erhalten.Dadurch brauch ich kein template mehr für die Hilfsfunktion get_indexes,sondern kann diese für std::vector<size_t> implementieren.
    Die set Geschichte um den längsten String zu finden halte ich für etwas oversized und hab das durch nen schlichtes if/else Konstrukt ersetzt.
    Die Geschichte mit dem alternativen Dateipfad hab ich minimal geändert(stream leeren).
    Die main hat jetzt 2 do/while Schleifen.
    addline habe ich ähnlich wie in meinen vorherigen Versionen implementiert,wobei ich es sinnvoller finden würde col neu zu setzen anstatt darauf zu bestehen dass die neue Zeile <=col sein muss.
    Schau dir den Code mal an.Hab den jetzt noch nicht groß getestet.
    Kannst ja mal schauen ob du noch irgendwelche Bugs findest.
    Alles andere können wir dann ja später besprechen :wink: .

    Quellcode

    1. #include <fstream>
    2. #include <iostream>
    3. #include <vector>
    4. #include <string>
    5. #include <iterator>
    6. #include <set>
    7. #include <sstream>
    8. #include <algorithm>
    9. class Editor
    10. {
    11. public:
    12. Editor():col(0){}
    13. typedef std::vector<std::string> linevector;
    14. typedef std::set<int> stringset;
    15. //Textdatei einelesen
    16. void einlesen()
    17. {
    18. std::cout <<"Ascii-Bild waehlen: Pfad angeben (1) oder Beispiel(2)";
    19. std::ifstream ifs;
    20. int wahl;
    21. std::cin >> wahl;
    22. if (wahl == 2){ifs.open("C:/asci1.txt");}
    23. else if (wahl == 1)
    24. {
    25. std::string temp_path;
    26. std::cout<<"Bitte den Pfad eingeben:";
    27. std::cin.ignore(std::cin.rdbuf()->in_avail());
    28. std::getline(std::cin,temp_path);
    29. ifs.open(temp_path.c_str());
    30. if(!ifs)
    31. {
    32. std::cout<<"Datei konnte nicht geoeffnet werden.\nProgramm wird beendet."<<std::endl;
    33. exit(-1);
    34. }
    35. }
    36. else {std::cout << "Keine gueltige Auswahl";exit(-1);}
    37. std::string tmp;
    38. linevector::iterator li; //LineIterator
    39. while(getline(ifs, tmp))
    40. {
    41. col = (tmp.size()>col)?tmp.size():col;
    42. lv.push_back(tmp);
    43. }
    44. for (li=lv.begin(); li!=lv.end(); li++)
    45. {
    46. std::cout << *li << std::endl;
    47. }
    48. }
    49. //Bestimmte Zeilen ansehen
    50. void viewline()
    51. {
    52. std::vector<size_t> intv;
    53. std::vector<size_t>::const_iterator inti;
    54. std::cout<<"Welche Zeilen sollen ausgegeebn werden?: \n\n";
    55. get_indexes(intv);
    56. linevector::iterator li;
    57. for (inti=intv.begin(); inti!=intv.end(); inti++)
    58. {
    59. li = lv.begin() + *inti; //li LineIterator, lv Linevector von außen
    60. std::cout << *li << std::endl;
    61. }
    62. }
    63. //Bestimmte Zeilen entfernen
    64. void removeline()
    65. {
    66. std::vector<size_t> indexes;
    67. std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
    68. get_indexes(indexes);
    69. std::sort(indexes.begin(),indexes.end());
    70. linevector::iterator li;
    71. std::vector<size_t>::const_reverse_iterator idx_rit;
    72. for (idx_rit=indexes.rbegin(); idx_rit!=indexes.rend(); ++idx_rit)
    73. {
    74. li = lv.begin() + *idx_rit; //li LineIterator, lv Linevector von außen
    75. lv.erase(li);
    76. }
    77. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    78. }
    79. //Zeilen hinzufügen
    80. void addline()
    81. {
    82. std::cout<<"Zeilen hinzufuegen: \n\n";
    83. std::string eingabe;
    84. std::cin.ignore(std::cin.rdbuf()->in_avail());
    85. do
    86. {
    87. std::getline(std::cin,eingabe);
    88. if(eingabe!="!end")
    89. {
    90. if(eingabe.size() > col)
    91. {
    92. //Waere es hier nicht sinnvoller col neu zu setzen?
    93. std::cout << "Zeile muss kleiner als " << col << " sein!"<<std::endl;
    94. break;
    95. }
    96. lv.push_back(eingabe); //lv Linevector von außen
    97. }
    98. else
    99. break;
    100. }while(std::cin.good());
    101. std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
    102. }
    103. //Rahmen zeigen -> OK
    104. void showline()
    105. {
    106. std::cout << "Symbol fuer Rahmen angeben: ";
    107. char symbol;
    108. std::cin >> symbol;
    109. std::string empty(col, ' ');
    110. std::string full(col + 4, symbol);
    111. std::cout << full << std::endl;
    112. std::cout << symbol << ' ' << empty << ' '<< symbol << std::endl;
    113. linevector::iterator li;
    114. for (li=lv.begin(); li!=lv.end(); ++li)
    115. {
    116. std::string max = *li;
    117. if(max.size() == col)
    118. std::cout << symbol << " " << *li << " " << symbol << std::endl;
    119. else
    120. {
    121. size_t dif = col - max.size();
    122. std::string fill(dif, ' ');
    123. std::cout << symbol << " " << *li << fill << " " << symbol<<std::endl;
    124. }
    125. }
    126. std::cout << symbol << ' ' << empty << ' '<< symbol << std::endl;
    127. std::cout << full << std::endl;
    128. }
    129. //Infos anzeigen lassen -> OK
    130. void infoline()
    131. {
    132. std::cout << "\nDas Ascii-Bild hat " << lv.size() <<" Zeilen und maximal " << col << " Spalten (ohne Rahmen).\n";
    133. }
    134. private:
    135. size_t col;
    136. linevector lv;
    137. //Hilfsfunktion
    138. bool get_indexes(std::vector<size_t>& index_vec,bool single_values = false)
    139. {
    140. std::string str;
    141. std::cin.ignore(std::cin.rdbuf()->in_avail());
    142. std::getline(std::cin,str);
    143. if(str =="")
    144. return false;
    145. else
    146. {
    147. size_t tmp;
    148. std::istringstream isstr(str);
    149. if(!single_values)
    150. {
    151. do
    152. {
    153. isstr>>tmp;
    154. if(isstr && tmp<lv.size())
    155. index_vec.push_back(tmp);
    156. else
    157. return false;
    158. }while(isstr);
    159. }
    160. else
    161. {
    162. isstr>>tmp;
    163. if(isstr && tmp<lv.size())
    164. index_vec.push_back(tmp);
    165. else
    166. return false;
    167. }
    168. return true;
    169. }
    170. }
    171. };
    172. int main()
    173. {
    174. char d;
    175. do
    176. {
    177. Editor edit;
    178. edit.einlesen();
    179. int wahl=0;
    180. do
    181. {
    182. std::cout<<"\nWas wollen sie machen?\n"<<
    183. "Zeilen ansehen (1)?\nZeilen hinzufuegen (2)?\nZeilen entfernen (3)?\nZeileninfos anzeigen (4)?\nRahmen gestalten (5)\nEnde(6)\n\n";
    184. std::cin >> wahl;
    185. switch(wahl)
    186. {
    187. case 1:edit.viewline();break;
    188. case 2:edit.addline();break;
    189. case 3:edit.removeline();break;
    190. case 4:edit.infoline();break;
    191. case 5:edit.showline();break;
    192. case 6:std::cout<<"Auf Wiedersehen"<<std::endl;break;
    193. default: std::cout << "Zahl nicht guelting\n";
    194. }
    195. } while(wahl != 6);
    196. std::cout<<"Neue Datei bearbeiten (j/n)? :";
    197. std::cin>>d;
    198. }while(d!= 'n' && d!='N');
    199. return 0;
    200. }
    Alles anzeigen


    Edit:Formatierung korrigiert.

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • Optimierung:
    Für den Fall dass der längste String gelöscht wird bietet es sich an jedes mal erst in showline die größte Länge zu ermitteln.

    Quellcode

    1. //global
    2. bool greater_string(const std::string& str1,const std::string& str2)
    3. {
    4. return str1.size()<str2.size();
    5. };
    6. ........
    7. void showline()
    8. {
    9. col = std::max_element(lv.begin(),lv.end(),greater_string)->size();
    10. std::cout << "Symbol fuer Rahmen angeben: ";
    11. char symbol;
    12. std::cin >> symbol;
    13. std::string empty(col, ' ');
    14. std::string full(col + 4, symbol);
    15. std::cout << full << std::endl;
    16. std::cout << symbol << ' ' << empty << ' '<< symbol << std::endl;
    17. linevector::iterator li;
    18. for (li=lv.begin(); li!=lv.end(); ++li)
    19. {
    20. std::string max = *li;
    21. if(max.size() == col)
    22. std::cout << symbol << " " << *li << " " << symbol << std::endl;
    23. else
    24. {
    25. size_t dif = col - max.size();
    26. std::string fill(dif, ' ');
    27. std::cout << symbol << " " << *li << fill << " " << symbol<<std::endl;
    28. }
    29. }
    30. std::cout << symbol << ' ' << empty << ' '<< symbol << std::endl;
    31. std::cout << full << std::endl;
    32. }
    Alles anzeigen

    Da col sonst nirgendwo benötigt wird kann col auch lokal definiert werden und sämtlicher anderer Code der sich auf col bezieht wegfallen.

    Edit:Korrektur-> max_element arbeitet ohne Predikat auf strings nicht wie erwartet.Deshalb greater_string hinzugefügt.

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)