Hallo,
im folgenden Code habe ich in f() und g() jeweils eine Variante einer
Schleife mit Abbruchbedingung in der Mitte. Mit getc() lies sich dies
vermeiden, mit getline() sehe ich mich dazu gezwungen. Das Beispiel
liest Zeilen aus einem Stream bis eine Leerzeile kommt.
1
#include<iostream>
2
#include<sstream>
3
#include<string>
4
#include<vector>
5
usingnamespacestd;
6
vector<string>f(istream&is){
7
strings;
8
vector<string>v;
9
while(1){
10
getline(is,s);
11
if(""==s){
12
break;
13
}
14
v.push_back(s);
15
}
16
returnv;
17
}
18
vector<string>g(istream&is){
19
vector<string>v;
20
for(strings;
21
getline(is,s),
22
""!=s;
23
){
24
v.push_back(s);
25
}
26
returnv;
27
}
28
intmain(intargc,char**argv){
29
strings="Line 1\nLine 2\nLine 3\n\nLine 5";
30
istringstreamiss1(s);
31
for(autoa:f(iss1)){
32
cout<<a<<endl;
33
}
34
cout<<"---"<<endl;
35
istringstreamiss2(s);
36
for(autoa:g(iss2)){
37
cout<<a<<endl;
38
}
39
return0;
40
}
1
% ./a.out
2
Line 1
3
Line 2
4
Line 3
5
---
6
Line 1
7
Line 2
8
Line 3
Derzeit liebäugle ich mit der Variante in g(), da ich while(1) und
for(;;) optisch nicht so schön finde.
Wie macht ihr sowas?
Ich würde auch keinen Stringvergleich machen sondern die Methode empty()
bemühen. So wird temporär ein std::string(""), der Vergleich
durchgeführt und dann wieder verworfen.
Oliver S. schrieb:> einfacher auf eof prüfen
Das sollte doch eigentlich getline() machen. Trotzdem stürtzt mir der PC
ab, wenn ich den String nicht vorher selber lösche. Was eigentlich auch
getline() machen sollte!?
Thomas K. schrieb:> keinen Stringvergleich machen sondern die Methode empty()> bemühen
Danke, das gefällt mir gut.
Dann sehen die Schleifen folgendermaßen aus, wobei mir immernoch g()
besser gefällt. Kennt ihr noch mehr Möglichkeiten solche Schleifen in
C++ auszudrücken. Oder auch zu Formatieren. In Ada gibts das ja built
in.
f()
Frank M. schrieb:> Warum packst Du das v.push_back(s) nicht auch noch hinter das letzte> Semikolon der for-Zeile?
Wozu sollte das gut sein? Der Lesbarkeit dient es nicht...
merciless
Wilhelm M. schrieb:> &&
Sehr schön. Jetzt prüft es auch explizit auf EOF.
Dirk K. schrieb:> Frank M. schrieb:>> Warum packst Du das v.push_back(s) nicht auch noch hinter das letzte>> Semikolon der for-Zeile?>> Wozu sollte das gut sein? Der Lesbarkeit dient es nicht...
Doch ich finde schon. Weil es die geschweiften Klammern spart.
Wilhelm M. schrieb:> for (const auto& a: read_if<std::string>(iss1, [](const auto&> s){return !s.empty();})) {
Ja, schaut sehr uebersichtlich und lesbar aus ;-) Der W. schafft es doch
immer den Obfuscation-Wettbewert zu gewinnen.
SCNR, leo
leo schrieb:> Ja, schaut sehr uebersichtlich und lesbar aus ;-) Der W. schafft es doch> immer den Obfuscation-Wettbewert zu gewinnen.
Das hängt immer zu 50% vom Leser ab ;-)
Wilhelm M. schrieb:> leo schrieb:>> Ja, schaut sehr uebersichtlich und lesbar aus ;-) Der W. schafft es doch>> immer den Obfuscation-Wettbewert zu gewinnen.>> Das hängt immer zu 50% vom Leser ab ;-)
Yep. Meine Erfahrung sagt mir a) die weitaus meiste Zeit verbringe ich
mit Lesen von Code und b) kuerzerer Code ist lesbarer und verbirgt
weniger Fehler.
leo
Wilhelm M. schrieb:> eher generisch machen
Wie hältst du es mit den ganzen Strings?
Wenn ich etwas generisch machen will dann kommt meist etwas heraus was
dem folgenden strukturell recht ähnlich sieht. Und ich erwische mich
dabei, wie ich schon längst aufgehöhrt habe an meinem Programm zu
arbeiten, sondern eigentlich am Compiler bastel.
Dann nehm ich meist einfach wieder nur char und string.
1
template <typename P
2
, typename CharT
3
, typename Traits = char_traits <CharT>
4
, typename Allocator = allocator <CharT>
5
, typename S = basic_string <CharT, Traits, Allocator>
6
, typename V = vector <S>>
7
V h (basic_istream <CharT, Traits>& is, P predicate) {
Peter Sahl schrieb:> Dirk K. schrieb:>> Wozu sollte das gut sein? Der Lesbarkeit dient es nicht...>> Doch ich finde schon. Weil es die geschweiften Klammern spart.
Lol, aber Schleifenköpfe auf mehrere Zeilen verteilen,
ganz großes Kino. Ich empfehle Lektüre zum
Thema "Clean Code" (https://clean-code-developer.de/).
merciless
Peter Sahl schrieb:> Wenn ich etwas generisch machen will dann kommt meist etwas heraus was> dem folgenden strukturell recht ähnlich sieht. Und ich erwische mich> dabei, wie ich schon längst aufgehöhrt habe an meinem Programm zu> arbeiten, sondern eigentlich am Compiler bastel.
Ist doch vollkommen unnötig.