MÜSSEN fstreams geschlossen oder gelöscht werden?



  • Bitte arbeite in deiner Freizeit weiter.



  • HALLO? Ich bin hier nur im Praxissemester 😮 und komm bald an die Obergrenze von Überstunden. Da arbeite ich doch nicht noch zuhause weiter! (zahlt mir ja niemand) 😉



  • So ich hab heute morgen wie gestern ja schon angekündigt ein kleines Programm gemacht, das mir genau das machen soll, worüber wir hier die ganze Zeit gesprochen haben. ich hab beides Probiert und hab mir für die ersten 4Byte in denen 'RIFF' stand mal den inhalt ausgeben lassen.

    bei deiden Varianten kam raus

    Es sollte RIFF drin stehen; es steht "RIFF" drin!

    Ok das freut mich ja schon mal ein wenig, jetzt bleibt mir aber noch die Frage, warum geht es dann nicht? In meinem eigentlichen Projekt geht es so nämlich nicht! Ich vermute ja das meine Ordner-öffnen-Funktion mir auch hier irgendwie den Speicher überschreibt, hab ich nämlich schon mal bemerkt.
    Kann mir einer sagen ob hier vielleicht der Fehler drin ist?
    Ich hab mal im Source dazu geschrieben, wo die Ordnergeschichte anfängt und aufhört, dass es etwas heraussticht hab ich es auskommentiert um eine andere Textfarbe zu bekommen. Denn ich bin mir ziemilich sicher da muss irgendswo der Fehler drin stecken, ich weiß leider nicht wo.

    //folder browse function hier die ganze Funktion
    /**************************************************************************
    int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
    {
    	switch(uMsg)
    	{
    	case BFFM_INITIALIZED:
    		{
    			// add your initialization code here
    		}
    		break;
    
    	case BFFM_SELCHANGED:
    		{
    			TCHAR szText[MAX_PATH] = {0};
    			SHGetPathFromIDList(reinterpret_cast<LPITEMIDLIST>(lParam), szText);
    			SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0,
    						reinterpret_cast<LPARAM>(szText));
    		}
    		break;
    	}
    
    	return 0;
    }
    ****************************************************************************/
    //Und dann meine OnButton
    void CWavealyzeView::OnButton1() 
    {
    	BOOL bWorking = FALSE;
    	CString Pfad ="";
    	CString messages = "";
    	CString XLSFile = "";
    	CString temp = "";
    	CStringArray DateiNamen;
    	CString ganzerPfad ="";
    	CFileFind itsFile;
    	CString Extensions = "ExportToExcel (*.xls)|*.xls|ExportToCsv (*.csv)|*.csv||";
    	CFileDialog ExportTO(FALSE,"xls","",OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXTENSIONDIFFERENT,Extensions,NULL);;
    	CExtendedExcel extendedXls;
    	DWORD dwAnfang = 0;
    	DWORD dwEnde = 0;
    	long AnzahlFiles = 0;
    	long passedTests = 0;
    
    // hier ist noch Ordner öffnen-Zeugs
    /********************************************
    	LPMALLOC pMalloc = NULL;
    	LPITEMIDLIST pidl = NULL;
    	BROWSEINFO bi;
    	ZeroMemory(&bi, sizeof(BROWSEINFO));
    *********************************************/
    // bis hier
    
    	ExportTO.DoModal();
    	XLSFile = ExportTO.GetPathName();
    	ExportTO.DestroyWindow();
    	CWaitCursor csr;
    
    	//Wenn das File nicht bereits an der Stelle besteht!
    	if(!itsFile.FindFile(XLSFile))
    	{
    
    //hier gehts weiter	// set the bi's default values
    /***************************************************************************
    		bi.hwndOwner = m_hWnd;
    		bi.lpszTitle = _T("Current folder to get BatchInfo is:");
    		bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
    		bi.lpfn = BrowseCallbackProc;
    		pidl = SHBrowseForFolder(&bi);
    		if(pidl != NULL)
    		{
    			SHGetPathFromIDList(pidl, Pfad.GetBuffer(Pfad.GetLength()));
    			// free memory
    			if(SUCCEEDED(SHGetMalloc(&pMalloc)) && pMalloc)
    			{
    				pMalloc->Free(pidl);  
    				pMalloc->Release(); 
    			}
    ******************************************************************************/
    //bis hier
    
    			ganzerPfad.Format("%s\\*.wav",Pfad); 
    			dwAnfang = GetTickCount();
    
    			bWorking = itsFile.FindFile(ganzerPfad);
    			AnzahlFiles = 0;
    			DateiNamen.RemoveAll();
    			while(bWorking)
    			{ 
    			    bWorking = itsFile.FindNextFile(); 
    				AnzahlFiles = DateiNamen.Add(itsFile.GetFilePath());
    			} 
    			itsFile.Close(); 
    		}
    		fstream FileBin;
    		for(int i = 0; i<AnzahlFiles; i++)
    		{
    			temp = DateiNamen.GetAt(i);
    			if (itsFile.FindFile(temp))
    			{
    				FileBin.open(temp, ios::in|ios::out|ios::binary);
    				if (FileBin.is_open()) 
    				{
    					m_Wavefile = FileBin;
    					//FileBin.close();
    					if(!batchexport(temp,XLSFile))
    					{
    						MessageBox("Fehler beim Exportieren!","FEHLER");
    						return;
    					}					
    				}
    				else
    				{
    					MessageBox("File "+temp+"bereits geöffnet, kein Zugriff möglich.","FEHLER");
    					return;
    				}
    			}
    			else
    			{
    				MessageBox("File not found","ERROR");
    				return;
    			}
    
    		}
    		dwEnde = GetTickCount();
    	}
    	else
    		AfxMessageBox("Angegebener Ordner enthält keine Wave-Dateien!",MB_ICONSTOP,0);
    }
    


  • FileBin.open(temp, ios::in|ios::out|ios::binary); 
      if (FileBin.is_open()) 
      { 
         m_Wavefile = FileBin; // wofür dieser Aufwand des Kopierens???
         if(!batchexport(temp,XLSFile)) 
         { 
            FileBin.close(); // schließen auch bei Fehler!!!
    
            MessageBox("Fehler beim Exportieren!","FEHLER"); 
            break;
         }
         FileBin.close(); // immer wieder schließen, sonst evtl. Fehler beim Öffnen der nächsten Datei!
      }
      else 
      { 
        MessageBox("File "+temp+"bereits geöffnet, kein Zugriff möglich.","FEHLER");
        break; 
      }
    

    Wofür öffnest du die Datei, stellst aber nichts mit ihr an!
    An die Funktion BatchExport solltest du den geöffneten fstream übergeben, nicht den Dateinamen!!!



  • FileBin.open(temp, ios::in|ios::out|ios::binary); 
      if (FileBin.is_open()) 
      { 
         m_Wavefile = FileBin; // wofür dieser Aufwand des Kopierens???
    // wenn das mit open funktioniert werde ich m_Wavefile.open machen 
    //da das aber nicht geht und ich den Stream als Member brauche weil zig
    //Funktionen was von dem wollen habe ich nen Stream angelegt
    //und in die Member kopiert.
         if(!batchexport(temp,XLSFile))  // Dateiname ist hier schon richtig
    //hier werden nur bereits berechnete Werte und der dazugehörige Dateiname exportiert
         { 
            FileBin.close(); // schließen auch bei Fehler!!!
    //jo stimmt schon aber da war ich ja auch grad nur am probieren  weil das open nicht funktioniert
    
            MessageBox("Fehler beim Exportieren!","FEHLER"); 
            break;
         }
         FileBin.close(); // immer wieder schließen, sonst evtl. Fehler beim Öffnen der nächsten Datei!
    //jo stimmt werd dran denken
      }
      else 
      { 
        MessageBox("File "+temp+"bereits geöffnet, kein Zugriff möglich.","FEHLER");
        break; 
      }
    

    Mein Problem ist das mir der Inhalt meines Streams überschrieben wird und ich nicht weiß von wem!



  • Ich würde als Fehlequelle mal auf das kopieren deines Streams tippen.
    Du öffnest BinFile dann kopierst du BinFile nach m_Wavefile ( ist m_Wavefile jetzt offen ? ) danach schliesst du BinFile wieder ( ist m_Wavefile jetzt noch immer offen ? ).
    In batchexport arbeitest du wahrscheinlich wieder mit m_Wavefile.
    Also ich würde das nicht machen.
    Kurt



  • m_Wavefile = FileBin;
    

    das geht auch glaub ich nicht mehr in visual c++ 7.1. sowas ist einfach nur scheisse.



  • OK jetzt haben mir soviele gesagt dass man das nicht macht, jetzt schreib ich das gleich nach der Mittagspause mal um und hoffe dann das das dann nicht mehr so das Problem ist.

    BTW: Ich arbeite mit MSVC6 und das kopieren an sich geht. Ich hab nur gesagt es geht hab nicht gesagt, dass es schön ist. Schreibs gleich um.

    Wen es interessiert hier mal das Zeitverhalten als Diagramm(Zeit in ms). Man erkennt deutlich die stetige Steigung.



  • hab jetzt keinen Fstream copy mehr drin und hab immernoch beschissenes Zeitverhalten. Ich habe es jetzt mit Open und mit close und dennoch ändert sich absolut nichts am Verhalten meiner Anwendung. Hat einer sonst noch ne Idee was hierdran schief gehen könnte?

    void CWavealyzeView::OnButton1() 
    {
    	BOOL bWorking = FALSE;
    	CString Pfad ="";
    	CString messages = "";
    	CString XLSFile = "";
    	CString temp = "";
    	CStringArray DateiNamen;
    	CString ganzerPfad ="";
    	CFileFind itsFile;
    	CString Extensions = "ExportToExcel (*.xls)|*.xls|ExportToCsv (*.csv)|*.csv||";
    	CFileDialog ExportTO(FALSE,"xls","",OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_EXTENSIONDIFFERENT,Extensions,NULL);;
    	CExtendedExcel extendedXls;
    	DWORD dwAnfang = 0;
    	DWORD dwEnde = 0;
    	long AnzahlFiles = 0;
    
    	LPMALLOC pMalloc = NULL;
    	LPITEMIDLIST pidl = NULL;
    	BROWSEINFO bi;
    	ZeroMemory(&bi, sizeof(BROWSEINFO));
    
    	ExportTO.DoModal();
    	XLSFile = ExportTO.GetPathName();
    	ExportTO.DestroyWindow();
    	CWaitCursor csr;
    
    	//Wenn das File nicht bereits an der Stelle besteht!
    	if(!itsFile.FindFile(XLSFile))
    	{
    		// set the bi's default values
    		bi.hwndOwner = m_hWnd;
    		bi.lpszTitle = _T("Current folder to get BatchInfo is:");
    		bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
    		bi.lpfn = BrowseCallbackProc;
    		pidl = SHBrowseForFolder(&bi);
    		if(pidl != NULL)
    		{
    			SHGetPathFromIDList(pidl, Pfad.GetBuffer(Pfad.GetLength()));
    			// free memory
    			if(SUCCEEDED(SHGetMalloc(&pMalloc)) && pMalloc)
    			{
    				pMalloc->Free(pidl);  
    				pMalloc->Release(); 
    			}
    			ganzerPfad.Format("%s\\*.wav",Pfad); 
    			dwAnfang = GetTickCount();
    
    			bWorking = itsFile.FindFile(ganzerPfad);
    			AnzahlFiles = 0;
    			DateiNamen.RemoveAll();
    			while(bWorking)
    			{ 
    			    bWorking = itsFile.FindNextFile(); 
    				AnzahlFiles = DateiNamen.Add(itsFile.GetFilePath());
    			} 
    			itsFile.Close(); 
    		}
    		//////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////
    		for(int i = 0; i<AnzahlFiles; i++)
    		{
    			temp = DateiNamen.GetAt(i);
    			if (itsFile.FindFile(temp))
    			{
    				m_Wavefile.open(temp, ios::in|ios::out|ios::binary);
    				if (m_Wavefile.is_open()) 
    				{
    					if(!batchexport(temp,XLSFile))
    					{
    						MessageBox("Fehler beim Exportieren!","FEHLER");
    						return;
    					}					
    				}
    				else
    				{
    					MessageBox("File "+temp+"bereits geöffnet, kein Zugriff möglich.","FEHLER");
    					return;
    				}
    				m_Wavefile.close();
    			}
    			else
    			{
    				MessageBox("File not found","ERROR");
    				return;
    			}
    
    		}
    		dwEnde = GetTickCount();
    		messages.Format("Formatieren von %d Dateien dauerte %d ms",i, dwEnde-dwAnfang);
    		MessageBox(messages,"INFO");
    		csr.Restore();
    	}
    	else
    		AfxMessageBox("Angegebener Ordner enthält keine Wave-Dateien!",MB_ICONSTOP,0);
    }
    


  • Hi.
    Aus deinem Code ist nicht ersichtlich was in dem Diagramm dargestellt wird.
    Ist es die Gesamtzeit für die Konvertierung ( dwEnde-dwAnfang ) oder die durchschnittliche Dauer der Konvertierung ( ( dwEnde-dwAnfang ) / i ) ?
    Falls es letzteres ist dann hast du wirklich einen komischen Effekt.
    Du vermutest dass es am öffnen und schliessen der Dateien liegt. Ist natürlich möglich. Könnte aber auch an der funktion batchexport liegen. Vielleich geht dir der Speicher wegen einem Memmoryleaks aus und Windows beginnt zu swappen.
    Ich würde einmal versuchen die funktion batchexport mit irgend einer anderen funktion zu ersetzen die zb die Datei zeichenweise einliesst und sonst nichts macht um herauszufinden ob der Effekt dann auch auftritt.
    Kurt



  • es ist letzteres also bei batchexport schreibe ich in ein Excelfile und ich hab mir bei jedem hinzufügen mal getTickCount mit ausgeben lassen und dann in Excel direkt immer ZelleX - Zelle(X-1) also immer die Zeit von einem export zum nächsten. Ich hab schon zig LeakTools benutzt und nie auch nur die geringste Schwankung drin gehabt. Der schwankt im Bereich von <3Byte constant überschreitet nie bestimmte Grenzen!

    Batchexport schaut so aus:

    CExtendedExcel xls;
    	CWavealyzeDoc* pDocument = GetDocument(); // GetDocument macht den cast 
    	if ( 0 != pDocument ) 
    	{
    		//zuerst die Informationen aus dem Header
    		if(!pDocument->isRIFF(m_Wavefile)|| !pDocument->isWave(m_Wavefile)|| !pDocument->isFMT(m_Wavefile))
    		{
    			MessageBox(FileName+" ist kein gültiges Wav-File!","FEHLER");
    			return FALSE;
    		}
    		if(!pDocument->getCompressingformat(m_Wavefile) == 1)
    		{
    			MessageBox(FileName+" scheint codiert zu sein!","FEHLER");
    			return FALSE;
    		}
    		if(!pDocument->isData(m_Wavefile))
    		{
    			MessageBox(FileName+" weist keinen gültigen Datenblock auf","ERROR");
    			return FALSE;
    		}
    		//errechnete Infos
    		long double *Ergebnisse = new long double [20];
    		pDocument->getCalculatedInfo(m_Wavefile, Ergebnisse);
    		bool ExpStat = xls.fastExport(Ergebnisse, FileName, XLSFile);
    		delete Ergebnisse;
    		if (!ExpStat)
    			return FALSE;
    	}
    	else
    	{
    		MessageBox("Fehler beim Erstellen vom Document","FEHLER");
    		return FALSE;
    	}
    	return TRUE;
    }
    

    Wobei da natürlich wieder soviele Funktionsaufrufe drin sind dass das vermutlich wieder nicht viel aussagt oder?



  • Als nächstes würde ich den aufruf

    ExpStat = xls.fastExport(Ergebnisse, FileName, XLSFile);
    

    weglassen um zu sehen ob der Effekt noch immer auftritt.
    Kurt


Anmelden zum Antworten