[Gelöst]Ofstream mit einer ProgressBar?



  • Hallo,
    ich habe einen binary file in den Resources von meinem Programm und den möchte ich als oftream extrahieren (Bis hier geht's auch), aber ich möchte das ganze mit einer ProgressBar machen, also müsste ich irgendwie den Status immer rausfinden so wie es zum Beispiel auch mit URLDownloadToFile geht. Bis jetzt habe ich dan irgendwan einen char* und den schreibe ich dan mit ofstream.write().

    Gibt es eine Möglichkeit dies zu machen? Wenn ja, wie?

    Vielen Dank
    Johannes



  • Äh blockweise schreiben?



  • Hallo,
    danke für die Antwort, aber wie meinst du das dann? Einfach charachterweise schreiben mit put()? Ist das dann nicht viel langsammer?

    Johannes





  • Nochmal danke für die Antwort,
    wie meinst du das Blockweise? Ich habe da nur den pointer zum ersten byte und von dem muss ich es dann weiter verarbeiten. Gibt es eine Möglichkeit die einzelnen bytes in einen vector<BYTE> zu kopieren und dann mit write() die einzelnen bytes schreiben, ist das das was du meinst? Wie schaffe ich den aufgrund des pointers von dem ersten byte alles ni den vector zu kopieren?

    Das hier ist mein Code:

    // get a pointer to the loaded resource!
    lpResLock = (char*)LockResource( hResourceLoaded ); 
    
    // determine the size of the resource, so we know how much to write out to file!  
    dwSizeRes = SizeofResource( NULL, hRes );
    
    std::ofstream outputFile(strOutputLocation.c_str(), std::ios::binary);
    outputFile.write((const char*)lpResLock, dwSizeRes);
    outputFile.close();
    

    So hatte ich es bis jetzt.

    Vielen Dank
    Johannes



  • Blockweise halt...
    Übergib write() nicht die gesamte size, sondern zB. nur 4000 (block). Dann beim nächsten Aufruf ab data + 4000 schreiben usw.



  • Danke, es klappt schon fast! Wie mache ich das write() ab data + blabla macht und nicht nocheinmal von 0 bis blabla?

    So ist jetzt mein code:

    std::ofstream outputFile(strOutputLocation.c_str(), std::ios::binary);
    	int Blocksize = dwSizeRes/100;
    	int NumBytesWritten = 0;
    	int Percent = 0;
    	while(NumBytesWritten < dwSizeRes)
    	{
    		if(NumBytesWritten+Blocksize < dwSizeRes)
    		{
    			outputFile.write((const char*)lpResLock, Blocksize);
    			NumBytesWritten += Blocksize;
    			Percent = NumBytesWritten / (dwSizeRes / 100);
    			std::cout << Percent << "%" << std::endl;
    		}
    		else
    		{
    			outputFile.write((const char*)lpResLock, dwSizeRes-NumBytesWritten);
    			NumBytesWritten += dwSizeRes-NumBytesWritten;
    			Percent = NumBytesWritten / (dwSizeRes / 100);
    			std::cout << Percent << "%" << std::endl;
    		}
    	}
    	outputFile.close();
    


  • nein mit der funktion write()

    ofstream schreib("test.txt",ios::out|ios::binary);
    int geschrieben = 0;
    int bloecke = 10; //je mehr bloecke,desto genauer die Fortschrittsanzeige,10 sollten reichen
    int blockgroesse;
    int groesse;
    int rest;
    char text[] = "1234567890";
    groesse = sizeof(text) - 1; //falls 0 Byte geschrieben werden soll, -1 weglassen
    blockgroesse = groesse/bloecke;
    rest = groesse - blockgroesse * bloecke;
    
    cout << blockgroesse << endl << bloecke << endl << rest << endl;
    
    for(int i=0;i<bloecke;i++)
    {
      schreib.write(text+geschrieben,blockgroesse);
      geschrieben += blockgroesse;
      cout << geschrieben << endl;
      cout << "Fortschritt: " << ( int( ( (float)geschrieben / groesse ) * 100 )) << "%" << endl;
      cin.get();
    }
    
    schreib.write(text+geschrieben,rest);
    schreib.close();
    


  • Vielen vielen dank!!! Es funktioniert perfekt!!!


Anmelden zum Antworten