10.7. Copying a File
Problem
You need to copy one file to another in a portable manner, i.e., without using OS-specific APIs.
Solution
Use C++ file streams in <fstream>
to copy
data from one stream to another. Example
10-9 gives an example of a buffered stream copy.
Example 10-9. Copying a file
#include <iostream> #include <fstream> const static int BUF_SIZE = 4096; using std::ios_base; int main(int argc, char** argv) { std::ifstream in(argv[1], ios_base::in | ios_base::binary); // Use binary mode so we can std::ofstream out(argv[2], // handle all kinds of file ios_base::out | ios_base::binary); // content. // Make sure the streams opened okay... char buf[BUF_SIZE]; do { in.read(&buf[0], BUF_SIZE); // Read at most n bytes into out.write(&buf[0], in.gcount()); // buf, then write the buf to } while (in.gcount() > 0); // the output. // Check streams for problems... in.close(); out.close(); }
Discussion
Copying a file may appear to be a simple matter of reading from one stream and writing to another. But the C++ streams library is large, and there are a number of different ways to do the reading and the writing, so you should know a little about the library to avoid costly performance mistakes.
Example 10-9 runs fast because it
buffers input and output. The read
and write
functions operate on entire buffers at a time—instead of a character-at-a-time copy loop—by reading from the input stream to the buffer and writing from the buffer to the output stream in chunks. They also do not do any kind ...
Get C++ Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.