irgendwas läuft schief
-
MFK schrieb:
Folgendes bitte abstellen:
- eof als SchleifenbedingungDarf ich fragen, was für einen Hintergrund das hat?
In anderen Sprachen (bspw. PHP) ist so etwas durchaus üblich.
Was ist die Alternative?
-
theliquidwave schrieb:
MFK schrieb:
Folgendes bitte abstellen:
- eof als SchleifenbedingungDarf ich fragen, was für einen Hintergrund das hat?
eof wird erst angezeigt, nachdem mindestens einmal ein Leseversuch das Dateiende überschritten hat. Dieser Versuch ist dann natürlich auch fehlgeschlagen, und an der Stelle muss man es schon abfangen.
In anderen Sprachen (bspw. PHP) ist so etwas durchaus üblich.
Da I/O in PHP im Wesentlichen an der stdio.h von C orientiert ist, würde ich das erstmal bezweifeln. Eigentlich kenn ich das nur von Pascal, das EOF schon angezeigt wird, wenn der nächste Leseversuch aufgrund des Dateiendes scheitern wird.
-
theliquidwave schrieb:
Darf ich fragen, was für einen Hintergrund das hat?
eof liefert erst dann true, wenn schon ein Lesevorgang fehlgeschlagen ist. Wenn man also nicht zusätzlich den Status nach dem eigentlichen Lesen prüft, hat man einmal Mist eingelesen. Besser ist es, den Lesevorgang selbst als Schleifenbedingung zu benutzen, oder gleich ganz ohne Schleife und statt dessen Algorithmen wie std::copy benutzen.
-
eof() bringt dir nichts, wenn im Stream irgendein Fehler aufgetreten ist.
Die Streams von C++ bieten eine Überladung für den !-Operator (not),
welcher true zurückgibt, wenn irgendwas nicht stimmt (fail(), eof(), whatever).
Zudem gibt es noch eine bool-Konvertierung, die genau das Gegenteil macht, als true liefert, wenn alles Okay ist.man kann also z.B. eine Textdatei so einlesen:
#include <fstream> #include <string> #include <vector> // ... std::ifstream in("foo.txt"); std::vector<std::string> content; while (in) { std::string line; std::getline(in, line, "\n"); content.push_back(line); }Nach dem Durchlaufen der Schleife hast du ein schönes Array mit Strings, wobei jeder String eine Zeile der Datei repräsentiert.
-
Okey hab mal n bissle rumgetüftelt
aber das mit dem vector hab ich einfach mal copie pastet da ich auf die schnelle nichts gefunden hab.wenn ich es jetzt ausführe kommt am schluss 2 mal die letzte zeite ... k.a. warum bzw. was gibt den der ifstream zurück?
testi.ini
[Test] variable=100 ASDF=10000032c++ code
[cpp] #include <iostream> #include <string> #include <Windows.h> #include <fstream> #include <vector> int einlesen(); using namespace std; int main() { einlesen(); return 0; } int einlesen() { ifstream fs("C:/testi.ini"); string text = ""; vector<string> content; while(fs) { getline(fs,text); content.push_back(text); cout<<text<<endl; } cin.get(); return 0; } [/cpp]
-
Warum Du die letzte Zeile doppelt siehst, wurde hier mehrfach schon damit erklärt, dass der Test, denn du als Schleifenbedingung hast, zu spät kommt. Du musst stattdessen testen, ob das getline funktioniert hat und ggf abbrechen.
-
Gute frage nächste frage
kann man einen Vector als rückgabewert verwenden? 
-
Weiss nicht obs schon erwähnt wurde, aber
char* var_ausles(char text[],char varname[]) { char var[] = " "; // .... return var; // möpmöpmöp problem }
-
DrakoXP schrieb:
Zudem gibt es noch eine bool-Konvertierung, die genau das Gegenteil macht, als true liefert, wenn alles Okay ist.
Meinten Sie: void*-Konvertierung?

-
Nein, in C++03 würde das wohl eher über eine Konvertierung in einen Zeiger auf eine eingebettete private Klasse hinauslaufen, da hier semantischer Dünnschiss ausgeschlossen wird und der Compiler dadraus in boolschen Kontexten (if) true oder false macht.
In C++11 kann das aber wunderbar durch einen expliziten operator bool erreicht werden.
-
also ich hab das mit dem rückgabe wert jetzt anderst geregelt vielen dank für den tipp mit den strings geht doch irgendwie besser
hab jetzt aber ein neues problem[code] //------ int varpos[3] = {0,0,0}; vector<string> complete_text; //<--- enthält den text schon string str = "test"; //------ varpos[1] = complete_text[i].find(0,str); [/code]der compiler gibt die fehlermeldung :
error C2664: 'unsigned int std::basic_string<_Elem,_Traits,_Ax>::find(const std::basic_string<_Elem,_Traits,_Ax> &,unsigned int) const': Konvertierung des Parameters 2 von 'std::string' in 'unsigned int' nicht möglich
aus und naja ich raffs net

-
Dagnih schrieb:
varpos[1] = complete_text[i].find(0,str); // <- 2.Parameter falsch gewähltder compiler gibt die fehlermeldung :
error C2664: 'unsigned int std::basic_string<_Elem,_Traits,_Ax>::find(const std::basic_string<_Elem,_Traits,_Ax> &,unsigned int) const': Konvertierung des Parameters 2 von 'std::string' in 'unsigned int' nicht möglich
-
da muss dan ein unsigned int rein oder wie? ... ich hab des versucht abzuändern doch komischer weiße kam exakt die gleiche fehlermeldung
jemand ne idee wie ich das richtig machen kann
ich will das am schluss in varpos[1] der anfangspunkt von der variable str in complete_text[i] steht
-
Schau dir doch mal an welche Parameter string::find braucht.
http://www.cplusplus.com/reference/string/string/find/