C++ Any faster method to write a large binary file?
c++
Solution
I'd suggest removing the `substr` call in the inner loop. You are allocating a new string and then destroying it for each character that you process. Replace this code:
for(::UINT Index2 = 7, Inc = 1; Index2 + 1 != 0; -- Index2, Inc += Inc )
if( BinaryStr.substr( Index1 * 8, 8 )[ Index2 ] == '1' )
Dec += Inc;
by something like:
for(::UINT Index2 = 7, Inc = 1; Index2 + 1 != 0; -- Index2, Inc += Inc )
if( BinaryStr[Index1 * 8 + Index2 ] == '1' )
Dec += Inc;
Problem
Goal My goal is to quickly create a file from a large binary string (a string that contains only 1 and 0). Straight to the point I need a function that can achieve my goal. If I am not clear enough, please read on. Example ``` Test.exe is running... . Inputted binary string: 1111111110101010 Writing to: c:\users\admin\desktop\Test.txt Done! File(Test.txt) In Byte(s): 0xFF, 0xAA . Test.exe executed successfully! ``` Explanation - First, Test.exe requested the user to input a binary string. - Then, it converted the inputted binary string to hexadecimal. - Finally, it wrote the converted value to a file called Test.txt. I've tried As an fail attempt to achieve my goal, I've created this simple (and possibly horrible) function (hey, at least I tried): ``` void BinaryStrToFile( __in const char* Destination, __in std::string &BinaryStr ) { std::ofstream OutputFile( Destination, std::ofstream::binary ); for( ::UINT Index1 = 0, Dec = 0; // 8-Bit binary. Index1 != BinaryStr.length( )/8; // Get the next set of binary value. // Write the decimal value as unsigned char to file. // Reset decimal value to 0. ++ Index1, OutputFile << ( ::BYTE )Dec, Dec = 0 ) { // Convert the 8-bit binary to hexadecimal using the // positional notation method - this is how its done: // http://www.wikihow.com/Convert-from-Binary-to-Decimal for( ::UINT Index2 = 7, Inc = 1; Index2 + 1 != 0; -- Index2, Inc += Inc ) if( BinaryStr.substr( Index1 * 8, 8 )[ Index2 ] == '1' ) Dec += Inc; } OutputFile.close( ); }; ``` Example of usage ``` #include "Global.h" void BinaryStrToFile( __in const char* Destination, __in std::string &BinaryStr ); int main( void ) { std::string Bin = ""; // Create a binary string that is a size of 9.53674 mb // Note: The creation of this string will take awhile. // However, I only start to calculate the speed of writing // and converting after it is done generating the string. // This string is just created for an example. std::cout << "Generating...\n"; while( Bin.length( ) != 80000000 ) Bin += "10101010"; std::cout << "Writing...\n"; BinaryStrToFile( "c:\\users\\admin\\desktop\\Test.txt", Bin ); std::cout << "Done!\n"; #ifdef IS_DEBUGGING std::cout << "Paused...\n"; ::getchar( ); #endif return( 0 ); }; ``` Problem Again, that was my fail attempt to achieve my goal. The problem is the speed. It is too slow. It took more than 7 minutes. Are there any method to quickly create a file from a large binary string? Thanks in advance, CLearner