MÜSSEN fstreams geschlossen oder gelöscht werden?



  • Nein brauchst du nicht selbst zu schließen. Das wird doch im Destruktor gemacht.



  • Also close brauchst du ja nicht machen, da wie bereits gesagt, das close autom. aufgerufen wird, wenn das fstream-Objekt zerstört wird. Und das passiert ja auch, da du ihn auf dem Stack instanzierst.

    Das einzige was ich nicht verstehe ist das:

    m_Wavefile = FileBin; //m_Wavefile = member fstream
    

    Im schlimmsten Fall wird hier der fstream kopiert. Kostet Zeit, das File wird auch nochmal (!) deshalb geöffnet. Hast alles doppelt gemoppelt. Übergib doch an batchexport den Filestream, als Reference und batchexport kann dann mit dem orig. fstream arbeiten.



  • Alles richtig, im Konstruktor wird der Stream geöffnet und im Destruktor geschlossen. Explizites Aufrufen von close() ist hierbei nicht notwendig.

    Hab mal davon gehört, dass unnütze Konstruktor- / Destruktoraufrufe teuer sein sollen. Ist vielleicht aber auch nur so ein Gerücht.

    Vielleicht läuft es ja ein bisschen schneller, wenn Du Dein fstream vor die Schleife packst und dann jedesmal explizit die Datei mit open() öffnest, liest und schließlich clear() und close() aufrufst.

    Was willst Du eigentlich mit der innersten If-Anweisung aussagen, ich seh da nur eine Zuweisung und einen Funktionsaufruf der gar nichts mit irgendwas ausser einem Dateinamen zu tun hat und was ist XLSFile?

    Gruss

    turing



  • das hab ich schon probiert ich brauch aber nen Zugriff auf diese Membervariable sehr oft,dadurch muss ich das lassen. Ich weiß dass ich durch diese kopieren Zeit verliere, aber das ist nicht so schlimm, das ist jetzt schon so und bei einem Durchlauf von wenigen Dateien passiert alles schnell genug! Nur irgendwo scheint er doch noch Leiche übrig zu lassen, doch ich weiß nicht wo! Seit ihr euch sicher dass ich so wie ich es gezeigt habe durch die Fstreams keine Leaks drin hab? Oder sind das nur vermutungen.
    Wann wird in meinem Source denn der Destruktor aufgerufen? Doch erst nach der schleife, oder nicht? Dann wenn ich die komplette Funktion verlasse. Oder? Sprich ich mach mir mal eben schnell 13000 Streams auf oder nicht? Bringt es was wenn ich mir den Stream vor der Schleife anleg und in der Schleife nur mit Open und Close arbeite?

    Ne ganz andere Frage ich hab grad nen Close eingebaut, nun bekomm ich folgende Meldung:

    ---------------------------
    FEHLER
    ---------------------------
    D:\acrsound\zum testen\050310_154850.wav ist kein gültiges Wav-File!
    ---------------------------
    OK
    ---------------------------

    Wieso das???



  • Das Performance-Problem kann auch eine Schicht tiefer liegen. Jeder Zugriff auf einen File (ob schreibend oder lesend), laesst das Programm mit den Betriebssystem reden - mit etwas Pech sogar ueber ein Netzwerk.

    Statt also einige tausend Male in den File zu schreiben, solltest Du das Ergebnis in eine eigene Ergebnisklasse schreiben, die schliesslich die Daten "am Stueck" in den File schreibt. Diese Klasse kann eine Verkettete Liste sein oder einfach (wenn man die STD benutzen will) auch ein Vector of String, der schliesslich in einen einzigen String verhackstueckt wird und dann am Stueck mit einem Aufruf in den FIle geschrieben.



  • OK fürs rausschreiben meiner Daten kann ich dir so ja noch recht geben, aber zum lesen leider nicht ich brauch die Werte von allen 13000 Files also muss ich auch alle 13000 öffnen oder etwa nicht??



  • guck doch im task manager nach wieviel handles geöffnet sind.

    am besten process explorer von sysinternals.com



  • Also ich hab mir das mal angeschaut und Filehandles hab ich nur eines immer offen, aber wieso kann ich nicht closen?

    Jetzt noch ein neues Phänomen, wenn ich fstream Filbin... mach dann öffnet er mir das file schön mach ich aber vor der schleife fstream filebin; und dann in der Schleife
    Filebin.Open und ich frag danach ab if (Filebin.IsOpen()) dann komm ich hier in den else Fall! Sprich er öffnet mir das File auch nicht! Woran liegt das?
    Wieso kann ich weder öffnen noch schließen?



  • Also ich bin nochmal ein Stück weiter aber kann mir einer von euch sagen wo der Unterschied zwischen denen beiden Zeilen liegt?

    FileBin.open(temp, ios::in|ios::out|ios::binary); //geht nicht EDIT: geht schon aber scheint nicht binär zu öffnen!
    fstream FileBin (temp, ios::in|ios::out|ios::binary); //geht
    

    Bei erster variante mach ich vor der Schleife fstream FileBin;
    muss ich da ohne ein File anzugeben schon sagen dass ich binär will? denn wenn ich das hier mache:

    char* pRiff = new char[4];
    	Wavefile.seekg(0,ios::beg);
    	Wavefile.read(pRiff,4);
    	if(pRiff[0] == 82 && pRiff[1] == 73 && pRiff[2] == 70 && pRiff[3] == 70)
    

    geht er mit erster variante in den else und im debug steht nur Datenmüll und bei zweitter Variante geht er mir darein!



  • oh, man dein code ist scheußlich. warum legst du ein 4 byte array auf dem heap an und warum vergleichst du jeden buchstaben einzeln und dann auch noch mit den zahlenwerten? man kann auch 'R' 'I' 'F' 'F' schreiben oder strcmp verwenden.



  • OFFTOPIC

    Ja wie jetzt so?

    bool CWavealyzeDoc::isRIFF(fstream Wavefile)
    {
    	char* pRiff = new char[4]; //ich will ja nur entsprechende 4 Byte vergleichen also hol ich mir auch nur die
    	Wavefile.seekg(0,ios::beg);
    	Wavefile.read(pRiff,4);
    	if(pRiff =='R' 'I' 'F' 'F') // <= SO????
    	{
    		delete [] pRiff;
    		return true;
    	}
    	else
    	{
    		delete pRiff;
    		return false;
    	}
    }
    


  • Du rufst jedesmal Konstruktor/Destruktor zwischen {...} auf. Das erklärt, warum Du nur ein Filehandle hast und das ist auch richtig.

    Hiermit darf es keine Probleme geben und du hast auch nur einmal einen Konstruktor / Destruktor aufgerufen.

    fstream file;
    for (...) {
      // deine Bedingungen
      file.open(...);
      if (!file)
        // fehler
      // mach was damit
      file.clear();
      file.close();
    }
    

    Nach obigem Beispiel hab ich mir jetzt ein kleines Programm zusammen geschnipselt und mehrmals 100.000x eine Datei öffnen, clearen und schliessen lassen. Das ganze hat konstant immer ca. 2800 ms gedauert. Ich will jetzt einfach mal so vermessen sein zu behaupten, dass dies schnell und auch richtig ist.

    Ich würde ausserdem die 13000 MsgBoxen weglassen 😃

    Gruss

    turing



  • ungefähr so:

    char riff[4];
    
    Wavefile.read(riff, 4);
    
    return strcmp(riff, "RIFF") == 0;
    


  • Polofreak schrieb:

    Also ich bin nochmal ein Stück weiter aber kann mir einer von euch sagen wo der Unterschied zwischen denen beiden Zeilen liegt?

    FileBin.open(temp, ios::in|ios::out|ios::binary); //geht nicht EDIT: geht schon aber scheint nicht binär zu öffnen!
    fstream FileBin (temp, ios::in|ios::out|ios::binary); //geht
    

    Bei erster variante mach ich vor der Schleife fstream FileBin;
    muss ich da ohne ein File anzugeben schon sagen dass ich binär will?

    Sagmal programmierst du eigentlich ohne irgendwelche Doku? Bitte geht jetzt gleich auf www.cppreference.com oder ähnliches und ließ dir durch wie Streams funktionieren.



  • und wenn du es wirklich einzelnd abprüfen willst, dann sollte es so gehen. das ist viel lesbarer als die zahlen

    if(pRiff[0] == 'R' && pRiff[1] == 'I' && pRiff[2] == 'F' && pRiff[3] == 'F')
    

    jetzt aber genug vom offtopic 🤡



  • ach eins noch: einmal benutzt du delete[] und einmal delete. Daher könnte ein Speicherleck oder sonstiges undefiniertes Verhalten auftreten.



  • erst @Offtopic
    das geht nicht da stehen 7Zeichen mehr drin als mein RIFF drum krieg ich da immer 0 zurück!

    @Turing: Vielen Dank für deine Bemühungen. So hab ich es jetzt auch vor, nur leider öffnet er mir mein File mit open anders als wenn ich ihm das gleich als übergabeparameter beim instanzieren mitgeb. beim übergeben beim Instanzieren kann ich Daten vernünftig einlesen wenn ich es mit open versuche steht nur schrott drin. Woran liegt das?

    @asdrubael: Danke ich habe mir aber schon durchgelesen wie Fstreams funktionieren, doch bin ich der Meinung das die oben genannten Zeilen das selbe tun, was aber in meinem Fall nicht so ist.



  • stimmt. müsste man noch mit \0 terminieren bevor man strcmp benutzt 🙂



  • Polofreak schrieb:

    @asdrubael: Danke ich habe mir aber schon durchgelesen wie Fstreams funktionieren, doch bin ich der Meinung das die oben genannten Zeilen das selbe tun, was aber in meinem Fall nicht so ist.

    Ja der Meinung kannst du gerne sein es ist aber nicht so.

    The function open() is used with file streams. It opens filename and associates it with the current stream. The optional io stream mode flag mode defaults to ios::in for ifstream, ios::out for ofstream, and ios::in|ios::out for fstream.



  • ja genau und zu Fstreams:

    The optional filename specifies the file to be opened and associated with the stream.

    Das ist doch genau das gleiche. Wo liegt der Unterschied? Könntest du mir das bitte erklären? Ich weiß wirklich nicht wo der Unterschied ist.
    Wäre sehr nett.

    @offtopic wenn ich die \0 terminierung reinmachen will, wo muss ich die machen wie sieht das aus??


Anmelden zum Antworten