Stream a file into std::vector<char>
                        by Curtis Krauskopf
                        This is an example program that reads itself using 
                          the STL std::copy algorithm. The file is read into a 
                          std::vector of char. This example uses istream_iterator, 
                          back_inserter and the noskipws manipulator to read the 
                          file. 
                         After the file has been imported into a std::vector, 
                          information about the vector (its current size, its 
                          capacity and its maximum allowed size) are written to 
                          the screen. 
                         Next, the vector is changed by prepending a C++ comment 
                          line to the std::vector of char. 
                         Finally, the entire contents of the vector is written 
                          to the screen using std::copy and an ostream_iterator. 
                         
                           
                            
// Stream_Copy.cpp
//
// Copyright (c) 2009 by Curtis Krauskopf
//                       >>>http://www.decompile.com
//
// Created:  July 15, 2009 by Curtis Krauskopf (cdk)
#include <algorithm>
#include <fstream>
#include <iterator>
#include <iostream>
#include <vector>
int main(int, char *)
{
  typedef std::istream_iterator<char> istream_iterator;
  typedef std::ostream_iterator<char> ostream_iterator;
  std::ifstream file("Stream_Copy.cpp");
  std::vector<char> buffer;
  file >> std::noskipws;
  std::copy(istream_iterator(file), istream_iterator(), std::back_inserter(buffer));
  // Now that the file has been loaded into our buffer, let's get some
  // information about the buffer:
  std::cout << "buffer size(): " << buffer.size() << std::endl;
  std::cout << "buffer capacity(): " << buffer.capacity() << std::endl;
  std::cout << "buffer max_size(): " << buffer.max_size() << std::endl;
  // Insert a C++ comment at the top of the buffer. (just to show we can)
  std::string helloWorld = "// Hello World\n";
  buffer.insert( buffer.begin(), helloWorld.begin(), helloWorld.end() );
  // And echo the buffer to std::out (just to show we can)
  std::copy(buffer.begin(), buffer.end(), ostream_iterator(std::cout, ""));
  return 0;
} | 
                           
                           
                            | Figure 1: Stream_Copy.cpp is 
                              an example C++ application that reads itself into 
                              a std::vector<char> (a vector of type char). 
                              The vector is eventually output to the screen using 
                              std::cout and an ostream_iterator. | 
                           
                         
                        .The output of the program looks like this: 
                        
                           
                             
                                 
                                    | 
                                    | 
                                    | 
                                 
                                 
                                    | 
                                  
buffer size(): 1313
buffer capacity(): 2048
buffer max_size(): 4294967295
// Hello World
// Stream_Copy.cpp
//
// Copyright (c) 2009 by Curtis Krauskopf
//                       >>http://www.decompile.com
//
// Created:  July 15, 2009 by Curtis Krauskopf (cdk)
#include <algorithm>
#include <fstream>
#include <iterator>
#include <iostream>
#include <vector>
int main(int, char *)
{
  typedef std::istream_iterator istream_iterator;
  typedef std::ostream_iterator ostream_iterator;
  std::ifstream file("Stream_Copy.cpp");
  std::vector buffer;
  file >> std::noskipws;
  std::copy(istream_iterator(file), istream_iterator(), std::back_inserter(buffe
r));
  // Now that the file has been loaded into our buffer, let's get some
  // information about the buffer:
  std::cout << "buffer size(): " << buffer.size() << std::endl;
  std::cout << "buffer capacity(): " << buffer.capacity() << std::endl;
  std::cout << "buffer max_size(): " << buffer.max_size() << std::endl;
  // Insert a C++ comment at the top of the buffer. (just to show we can)
  std::string helloWorld = "// Hello World\n";
  buffer.insert( buffer.begin(), helloWorld.begin(), helloWorld.end() );
  // And echo the buffer to std::out (just to show we can)
  std::copy(buffer.begin(), buffer.end(), ostream_iterator(std::cout, ""));
  return 0;
}
 | 
                                    | 
                                 
                                 
                                    | 
                                    | 
                                    | 
                                 
                                | 
                           
                           
                            | Figure 2: The output of running 
                              Stream_Copy.cpp | 
                           
                         
                        The first three lines of the program's output show 
                          some statistics about the vector. The total size of 
                          the file is 1313 bytes and that's exactly how many bytes 
                          were used in the vector. 
                         The vector's capacity() is the number of characters 
                          that the vector can contain before its size is internally 
                          incremented. If you compile and execute this program, 
                          the capacity on your application might be different 
                          because compiler vendors are allowed increase the space 
                          reserved for a vector in any way they want. 
                         The max_size() is the maximum number of characters 
                          the vector could ever contain. Your program might show 
                          a different value on this line, too. 
                         The program prepended a Hello World comment to the 
                          source code just to show that it can. 
                         The vector was written to the screen using an ostream_iterator 
                          and std::copy. The constructor for the ostream_iterator 
                          used std::cout and an empty string as parameters. This 
                          was actually overkill because the std::ostream_iterator<char> 
                          template implementation would have defaulted the second 
                          parameter to an empty string even if it wasn't provided. 
                          In other words, the program would have generated almost 
                          the same output if this line had been used: 
                         
                           
                              // And echo the buffer to std::out (just to show we can)
  std::copy(buffer.begin(), buffer.end(), ostream_iterator(std::cout));  | 
                           
                           
                            | Figure 3: This code sample shows 
                              an equally valid way to copy the vector to std::cout. | 
                           
                         
                        Conclusion:
												Reading a file into a std::vector<char> is very 
                          easy. Every byte of the text file is present in the 
                          program, including the newline characters. In addition, 
                          the std::vector<char> template provides features 
                          that a regular character buffer easily provide, such 
                          as being able to insert text anywhere in the buffer 
                          -- even at the very beginning. 
  Copyright 2003-2010 The Database Managers, Inc. 
 
 Popular C++ topics at The Database Managers: 
                        
 |