Add a hacky check for text file size in ReadFileToString. Fixes issue 6455.

This commit is contained in:
Pierre Bourdon 2013-09-16 06:56:49 +02:00
parent a7e1fb81b1
commit f0fc611f15
2 changed files with 33 additions and 3 deletions

View File

@ -885,8 +885,34 @@ bool ReadFileToString(bool text_file, const char *filename, std::string &str)
if (!f)
return false;
size_t read_size;
str.resize(GetSize(f));
return file.ReadArray(&str[0], str.size());
bool retval = file.ReadArray(&str[0], str.size(), &read_size);
// On Windows, reading a text file automatically translates \r\n to \n.
// This means we will read less characters than the expected size of the
// file. In that case, ignore the return value and count ourselves.
#ifdef _WIN32
if (text_file)
{
size_t count = 0;
for (size_t i = 0; i < read_size; ++i)
{
if (str[i] == '\n')
count += 2;
else
count += 1;
}
if (count != str.size())
return false;
str.resize(read_size);
return true;
}
#endif
return retval;
}
IOFile::IOFile()

View File

@ -161,11 +161,15 @@ public:
bool Close();
template <typename T>
bool ReadArray(T* data, size_t length)
bool ReadArray(T* data, size_t length, size_t* pReadBytes = NULL)
{
if (!IsOpen() || length != std::fread(data, sizeof(T), length, m_file))
size_t read_bytes = 0;
if (!IsOpen() || length != (read_bytes = std::fread(data, sizeof(T), length, m_file)))
m_good = false;
if (pReadBytes)
*pReadBytes = read_bytes;
return m_good;
}