You are not logged in.

  • Login

1

Saturday, November 25th 2006, 12:42am

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:

C Quellcode

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


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

2

Saturday, November 25th 2006, 2:05am

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:

C Quellcode

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

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

3

Saturday, November 25th 2006, 11:55am

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..

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//Bestimmte Zeilen entfernen
	void removeline()
    {
		typedef std::set<int> index_set;
        index_set indexes;
 
        std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
        int eingabe;
		const unsigned int lvsize = lv.size();
 
		while (std::cin >> eingabe && eingabe != 999 ){
 
			if (eingabe > lvsize)
			{
				std::cout<< eingabe << " liegt ausserhalb des Bildes "; 
			}
 
            indexes.insert(eingabe);   
 
            linevector::iterator li;
            index_set::const_reverse_iterator idx_rit;
 
			for (idx_rit=indexes.rbegin(); idx_rit!=indexes.rend(); ++idx_rit)
            {
				li = lv.begin() + *idx_rit; //li LineIterator, lv Linevector von außen
                lv.erase(li);
            }
		}
 
		std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
 
	}

4

Saturday, November 25th 2006, 2:13pm

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

C Quellcode

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

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

5

Saturday, November 25th 2006, 2:36pm

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... :)

6

Saturday, November 25th 2006, 7:15pm

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... :

C Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#include "AsciiEditor.h"
 
#include <fstream>
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <set>
 
 
class Editor
{
public:
    typedef std::vector<std::string> linevector;
	typedef std::set<int> stringset;
	unsigned int col;
 
 
    //Textdatei einelesen
    void einlesen()
    {
 
		/*Hier fehlt noch manuelle Angabe des Pfads oder Beispieldatei
		Auswahl: 1 -> pfad (ifs(pfad) oder 2 Beispiel-Datei*/
 
		std::cout <<"Ascii-Bild waehlen: Pfad angeben (1) oder Beispiel(2)";
 
		/*	klappt leider nicht                       
		int wahl;
		std::cin >> wahl;
		if (wahl == 2){std::ifstream ifs("C:/asci1.txt");}
		if (wahl == 1){/*anuelle Pfadangabe}
		 {std::cout << "Keine gueltige Auswahl";}
		*/
 
		std::ifstream ifs("C:/asci1.txt"); 
        std::string tmp;
 
        linevector::iterator li; //LineIterator
 
		stringset maxstring;
 
        while(getline(ifs, tmp))
        {
			maxstring.insert(tmp.size());
			lv.push_back(tmp);
            tmp = std::string();
 
 
        }
		stringset::const_reverse_iterator aa;
		aa = maxstring.rbegin();
		col = *aa;
 
		for (li=lv.begin(); li!=lv.end(); li++)
        {
			std::cout << *li << std::endl;
        }
    }
 
    //Bestimmte Zeilen ansehen
	//Statt 999 besser "Enter" als Abbruchbedinung
    void viewline()
    {
        typedef std::vector<int> intvector;
        intvector intv;
        intvector::const_iterator inti;
        std::cout<<"Welche Zeilen sollen ausgegeebn werden?: \n\n";
        int eingabe;
 
 
		while (std::cin >> eingabe && eingabe != 999)
        {
 
            intv.push_back(eingabe);    
        }
 
        linevector::iterator li;
        for (inti=intv.begin(); inti!=intv.end(); inti++)
        {
            li = lv.begin() + *inti; //li LineIterator, lv Linevector von außen
            std::cout << *li << std::endl;
        }
	}
 
	//Bestimmte Zeilen entfernen
	//Statt 999 besser "Enter" als Abbruchbedinung
	void removeline()
    {
		typedef std::set<int> index_set;
        index_set indexes;
 
        std::cout<<"Welche Zeilen sollen geloescht werden?: \n\n";
        int eingabe;
		const unsigned int lvsize = lv.size();
 
		while (std::cin >> eingabe && eingabe != 999 ){
 
			if (eingabe > lvsize)
			{
				std::cout<< eingabe << " liegt ausserhalb des Bildes "; 
			}
 
            indexes.insert(eingabe);   
 
            linevector::iterator li;
            index_set::const_reverse_iterator idx_rit;
 
			for (idx_rit=indexes.rbegin(); idx_rit!=indexes.rend(); ++idx_rit)
            {
				li = lv.begin() + *idx_rit; //li LineIterator, lv Linevector von außen
                lv.erase(li);
            }
		}
 
		std::copy(lv.begin(),lv.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
 
	}
 
	//Zeilen hinzufügen
	//Problem: Fügt das erste Wort eine Zeile nicht ein
 
	void addline()
    {
        std::cout<<"Zeilen hinzufuegen: \n\n";
 
		std::string eingabe;
		std::string tmp;
 
		while(getline(std::cin >> eingabe, tmp)&& eingabe != "end!")
		{
			if(eingabe.size() > col)
			{
				std::cout << "Zeile muss kleiner als " << col << " sein!";
				break;
			}
			lv.push_back(tmp);			//lv Linevector von außen
            tmp = std::string();
		}
 
		linevector::iterator li;
		for (li=lv.begin(); li!=lv.end(); li++)
		{
			std::cout << *li << std::endl; //li LineIterator, lv Linevector von außen
		}
	}
 
	//Rahmen zeigen -> OK
	void showline()
    {
		std::cout << "Symbol fuer Rahmen angeben: ";
 
		char symbol;
 
		std::cin >> symbol;
 
		std::string empty(col, ' ');
		std::string full(col + 4, symbol);
 
		std::cout <<  full <<  std::endl;
		std::cout << symbol << ' ' << empty << ' '<< symbol << std::endl;
 
		linevector::iterator li;
 
        for (li=lv.begin(); li!=lv.end(); ++li)
        {
			std::string max = *li;
			if(max.size() == col){ 
            std::cout << symbol << " " << *li << " " << symbol << std::endl;
			}
			else{
			unsigned int dif = col - max.size();
			std::string fill(dif, ' ');
 
			std::cout << symbol << " " << *li << fill << " " << symbol;
			}
 
        }
		std::cout << "\n" << symbol << ' ' << empty << ' '<< symbol << std::endl;
		std::cout <<  full <<  std::endl;
	}
 
	//Infos anzeigen lassen -> OK
	void infoline()
	{
		std::cout << "\nDas Ascii-Bild hat " << lv.size() <<" Zeilen und maximal " << col << " Spalten (ohne Rahmen).\n";
 
	}
 
private:
    linevector lv; //Linevector
	stringset maxstring;
};
 
int main(){
 
	/*Sollte nur einmal edit.einlesen aufrufen, aber durch den main()-Aurufen
	weiter unten wird sie auch immer wieder neu geladen, ich weiß nicht wie ich
	die anderen Funktionen speriert aufrufen kann*/
 
	/*Sollte noch eine Exit-Funktion bzw. neues AsciiLaden-Funktion bekommen*/
 
	Editor edit;
	edit.einlesen();
 
	std::cout<<"\nWas wollen sie machen?\n"<<
	"Zeilen ansehen (1)?\nZeilen hinzufuegen (2)?\nZeilen entfernen (3)?\nZeileninfos anzeigen (4)?\nRahmen gestalten (5)\n\n";
 
	int wahl;
	std::cin >> wahl;
	switch(wahl)
	{
	case 1:edit.viewline();break;
	case 3:edit.removeline();break;
	case 2:edit.addline();break;
	case 5:edit.showline();break;
	case 4:edit.infoline();break;
	default: std::cout << "Zahl nicht guelting\n"; 
	}
	main();
	return 0;
}

7

Sunday, November 26th 2006, 3:38pm

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: .

C Quellcode

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


Edit:Formatierung korrigiert.

Gruß void

8

Sunday, November 26th 2006, 4:21pm

hey void.. wow.. super vielen Dank.. ich habs grad mal kurz getestet und es läuft super :O ... nun muss ich erstmal noch die Änderungen alle kapieren, aber das klappt schon.. bin nun erstmal draußen.. fahr zu meinen Eltern.. ich meld mich nochmal bei dir..

DANKEEEEEEEEEEEEE!!!!!!

lg.july

9

Sunday, November 26th 2006, 4:22pm

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.

C Quellcode

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

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

10

Monday, November 27th 2006, 3:59pm

oki.. alles klar.. ich werds mit anbauen.. dankeeee :)

lg.july

Similar threads

Social bookmarks