Problem bei ifstream



  • Vollgendes Problem liegt vor und ich komme irgendwie nicht drauf voher das überhaupt kommt:
    Hab ein kleines Programm geschrieben um fstream bibliothek auszuprobieren.
    In kürze was es tut:
    1. es liest eine Datein ein in der nummer pro zeile eine steht und schreibt es nach einer Umwandlung in einen eindimensionalen array. Letzte zahl wird auf 0 gesetzt. Array ist initialisiert umd as vorwegzunehmen.(funkt auch mit atoi).
    2. eine weitere Datei soll eingelsen werden zeichen für zeichen, dabei werden ein paar Zeichen rausgefiltert (was kein Problem darstellt).
    Dieser Vorgang wird so lange wiederholt solange im oben genanntem array 0 auftaucht:

    ifstream trainer;
    	int  count=0, s=0; 
    	input.open("input.sql", ios::in | ios::binary);
    	ofstream final;
    	char c;
    	final.open("output.sql", ios::out | ios::binary);
    	while(array_int[s]!=0) // tut solange bis eine Null aufgetroffen wird.
    	{
    		while (!input.eof()) 
    		{
    			c=input.get();
    			if (int(c)==int('('))  // <-- Anfang vom filter
    			{
    				count++;
    				final.put(c);
    			} else if (count == 2)
    			{
    				final.put(array_int[s]);
    				count=0;
    			} else 
    			{
    				final.put(c);
    			} // <-- Ende vom filter.
    		}
    		s++;
    		input.seekg(0, ios::beg); //<-- sollte an den anfang von iput.sql gehen, bezweifle das es funktioniert.
    	}
    	/********/
    	// close
    	flush(final);
    	final.close();
    	trainer.close();
    

    Die Eingabe wird nur ein mal in die datei geschrieben trotz mehrer Zahlen im array vor der 0.
    Der Inhalt der Datei in die geschrieben wird hat seltsame Zeichen am Ende

    ÿÿ

    . Mehr Zeichen tauchen auf um so mehr Zahlen im array stehen.

    Würde mich freuen, wenn jemand mir das Problem erklären würde bzw. eine Lösung anbieten würde.
    Warscheinlich sehe ich mal wieder den Wald vor lauter Bäumen nicht.

    Vielen Dank schon mal im Voraus.



  • Aus welchem Buch hast Du diesen Stil mit dem open und close?



  • C++ Referenz von Franzis aber es scheint nicht das Problem zu sein, da das öffnen funktioniert und Compilerfehler gibts auch nicht.
    Ich weiß man könnte noch:

    final.open("output.sql", ios::out, ios::binary);
    

    Spielt aber keine Rolle in so fern. Glaub ich zu mindest.



  • crackm schrieb:

    C++ Referenz von Franzis

    Danke.

    crackm schrieb:

    Ich weiß man könnte noch:

    final.open("output.sql", ios::out, ios::binary);
    

    Spielt aber keine Rolle in so fern. Glaub ich zu mindest.

    Eher

    ofstream final("output.sql",ios::binary);
    

    und niemals open und close verwenden.
    Spielt aber zu Deiner Frage keine Rolle, es war nur, damit ich das Buch abhaken kann. Aber es hatte den Haken schon.



  • Zugriffsrechte werden dann garnicht gesetzt oder wie ?
    Ist es dafault ios::in?


  • Mod

    volkard schrieb:

    [...] und niemals open und close verwenden.

    Jetzt frage ich mich, was dagegen spricht. Ich habe das auch so gelernt, benutze es aber aus Schreibfaulheit nur selten. Bitte um Aufklärung.





  • crackm schrieb:

    Zugriffsrechte werden dann garnicht gesetzt oder wie ?
    Ist es dafault ios::in?

    unterschiedlich!
    bei ifstream ist es ios::in und bei ofstream ist es ios::out. also man kann sie ignorieren, es klappt von allein.



  • volkard schrieb:

    löscht seekg das eof-flag?

    Es sollte oder zumindest beabsichtige ich es, aber ob es passiert kann man ja kaum überprüfen, d.h. habe ich ja rangeschrieben, dass ich bezweifle das es funktioniert.



  • volkard schrieb:

    crackm schrieb:

    Zugriffsrechte werden dann garnicht gesetzt oder wie ?
    Ist es dafault ios::in?

    unterschiedlich!
    bei ifstream ist es ios::in und bei ofstream ist es ios::out. also man kann sie ignorieren, es klappt von allein.

    außer den zwei modi gibts noch mehr ios::app zum Beispiel, ist nebenbei gesagt sehr nützlich.
    Aber es tut hier nnix zur Sache.



  • crackm schrieb:

    außer den zwei modi gibts noch mehr ios::app zum Beispiel, ist nebenbei gesagt sehr nützlich.
    Aber es tut hier nnix zur Sache.

    Ja, ios::app ist das einzige, was ich benutze.
    Hab im Post um 12:02 einen Link zugefügt, wo andere das gleiche Problem hatten und lösten.



  • nein, das Problem bei ihm sieht zwar oberflächlich ähnlich aus, hab aber andere Ursachen, wie !Obj.eof() un ähnliches, hilft mir d.h. nicht.



  • Wie wärs denn mal mit Debuggen? Und kannst ja vielleicht mal den Source und die Dateien online stellen, damit wir uns das genauer angucken können. Und warum benutzt du keine for Schleife? Sticht sofort ins Auge.



  • Source welche Probleme macht steht im ersten Post der Rest funktioniert.
    Der Inhalt der einzulesenen Datei:

    insert into beg (entry, id, key) VALUES (31, 21, 25864);
    insert into beg (entry, id, key) VALUES (31, 23, 25864);
    

    Die Liste der Zahlen tut aber auch nicht zur Sache:

    1
    2

    For-Schleife haben den Nachteil das die Angaben schon vor der Ausführung fest stehen sollten, dass ist aber nicht der Fall.



  • crackm schrieb:

    nein, das Problem bei ihm sieht zwar oberflächlich ähnlich aus, hab aber andere Ursachen, wie !Obj.eof() un ähnliches, hilft mir d.h. nicht.

    Ups, dann hab ich wohl falsch gelesen, ich dachte, er hätte genau wie Du clear() vor seekg() vergessen, weshalb der stream noch im eof-ich-tue-nix-mehr-modus war und auch nicht seekgte.



  • Vielleicht fehlt der NULL Terminator am Ende der Datei?



  • volkard schrieb:

    crackm schrieb:

    nein, das Problem bei ihm sieht zwar oberflächlich ähnlich aus, hab aber andere Ursachen, wie !Obj.eof() un ähnliches, hilft mir d.h. nicht.

    Ups, dann hab ich wohl falsch gelesen, ich dachte, er hätte genau wie Du clear() vor seekg() vergessen, weshalb der stream noch im eof-ich-tue-nix-mehr-modus war und auch nicht seekgte.

    Ups das habe ich überlesen, ja ich habe auch clear vergessen, jetzt stimmt die Anzahl der Ausgaben. Thx, denn Rest schaffe ich allein. Kann geschloßen werden.


Anmelden zum Antworten