我使用以下代码(取自https://codereview.stackexchange.com/questions/22901/reading-all-bytes-from-a-file)将文件有效地读取到C ++中的数组中:
static std::vector<char> ReadAllBytes(char const* filename)
{
std::ifstream ifs(filename, std::ios::binary | std::ios::ate);
std::ifstream::pos_type pos = ifs.tellg();
std::vector<char> result(pos);
ifs.seekg(0, std::ios::beg);
ifs.read(&result[0], pos);
for (unsigned int i = 0; i < result.size(); i++)
if (result.at(i) != 0)
return result; // [1]
//if (!ifs.good()) // Commenting out changes contents of result
// return result; // [2] // Commenting out changes contents of result
return result; // [3]
}
一切工作正常,在[1]处的断点触发,该函数返回数据(该循环仅用于调试,因为我一直在获取0填充的返回值,该返回值应保存数据)。但是,一旦删除[2]处的If-Statement,就会触发断点[3],并且该数组为空(大小正确,但是该数组填充有零)。
从未执行过的代码如何真正改变函数的行为?我认为这可能与堆栈布局有关,而且我将流和数据作为局部变量保存,但在堆上手动创建它们会导致完全相同的情况。
你看我完全困惑。我以前从未见过像这样的东西。这怎么可能?
PS:我应该补充一点,文件内容是二进制文件,文件大小约为32 MB。
对于任何想知道的人:在这里我都无法查明C ++编译器异常行为的原因(也许我确实发现了一个错误?)。
但是,一旦分块读取文件,一切都会完美无瑕。为了方便起见,我将发布代码:
static bool ReadAllBytes(char const* filename, char** result, size_t* size)
{
const size_t BUFFER_SIZE = 32;
std::ifstream ifs(filename, std::ios::binary | std::ios::ate | std::ios::in);
*size = ifs.tellg();
*result = new char[*size];
ifs.seekg(0, std::ios::beg);
size_t operations = *size / BUFFER_SIZE;
size_t chunks = 0;
for (; chunks < operations && ifs.good(); chunks++)
ifs.read(*result + chunks * BUFFER_SIZE, BUFFER_SIZE);
if (ifs.good() && *size % BUFFER_SIZE > 0)
ifs.read(*result + chunks * BUFFER_SIZE, *size % BUFFER_SIZE);
return (ifs.good());
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句