# Reading all bytes from a file

I'm basically trying to write a helper function that reads a whole file and returns the data and the number of bytes read.

Can you tell me if is correctly written and used?

#include <iostream>

{
ifstream ifs(filename, ios::binary|ios::ate);
ifstream::pos_type pos = ifs.tellg();
int length = pos;
char *pChars = new char[length];
ifs.seekg(0, ios::beg);
ifs.close();
return pChars;
}

int _tmain(int argc, _TCHAR* argv[])
{
const char * filename = "polar00.map";
delete[] pChars;
return 0;
}


A few things I would do differently:

static char * ReadAllBytes(const char * filename, int * read)
{
ifstream ifs(filename, ios::binary|ios::ate);
ifstream::pos_type pos = ifs.tellg();

// What happens if the OS supports really big files.
// It may be larger than 32 bits?
// This will silently truncate the value/
int length = pos;

// Manuall memory management.
// Not a good idea use a container/.
char *pChars = new char[length];
ifs.seekg(0, ios::beg);

// No need to manually close.
// When the stream goes out of scope it will close the file
// automatically. Unless you are checking the close for errors
// let the destructor do it.
ifs.close();
return pChars;
}


How I would do it:

static std::vector<char> ReadAllBytes(char const* filename)
{
ifstream ifs(filename, ios::binary|ios::ate);
ifstream::pos_type pos = ifs.tellg();

std::vector<char>  result(pos);

ifs.seekg(0, ios::beg);

return result;
}


Note:

static std::vector<char> ReadAllBytes(char const* filename)


It may seem like an expensive copy operation. But in reality NRVO will make this an in-place operation so no copy will take place (just make sure you turn on optimizations). Alternatively pass it as a parameter:

static void ReadAllBytes(char const* filename, std::vector<char>& result)

• I love this answer, never thought of referencing vector[0] to access the raw memory block underneath it. – Jason Larke Feb 20 '13 at 7:53
• This is very typical when using C++ containers and calling C code. – Martin York Feb 20 '13 at 16:20
• An alternative to &vector[0] is vector.data(). – Aidiakapi Jul 18 '15 at 17:38
• What about error checking. Both opening and reading might fail. – Zitrax Sep 23 '15 at 7:37
• In C++11, you can also get to the vector's memory by calling vector.data(). – Tolli Jun 28 '16 at 14:39