C ++未执行的代码更改功能行为?

最大限度

我使用以下代码(取自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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++未执行的代码更改功能行为?

来自分类Dev

ZSH功能行为?(运行C ++)

来自分类Dev

奇怪的窗口功能行为

来自分类Dev

Android拆分功能行为

来自分类Dev

带有匿名功能的功能行为

来自分类Dev

C ++模板功能的行为

来自分类Dev

“ foreach”导致我的功能行为异常

来自分类Dev

前向脱位改变功能行为?

来自分类Dev

从C#执行JS代码异常:预期功能

来自分类Dev

从C#执行JS代码异常:预期功能

来自分类Dev

在C ++中获取用户输入未执行/跳过的代码

来自分类Dev

C ++代码段执行

来自分类Dev

从php执行C代码

来自分类Dev

需要解释C ++代码的行为

来自分类Dev

R中意外的套用功能行为

来自分类Dev

如何专门化(重载)单个类型的功能行为?

来自分类Dev

更新到Swift 3后奇怪的转义功能行为

来自分类Dev

链接功能中的代码未执行?

来自分类Dev

哪种C ++设计模式可用于在生产代码和测试代码之间交换功能模板的行为?

来自分类Dev

如何使用Selenium和以C#编写的代码执行Cntrl + A功能

来自分类Dev

在关闭时以及在使用MVVM更改ViewModel-C#时执行功能

来自分类Dev

以原子方式执行C代码

来自分类Dev

执行javap -c生成的代码

来自分类Dev

C ++更改代码中的输出可执行文件名称

来自分类Dev

C中的功能参数更改

来自分类Dev

在C中更改功能参数

来自分类Dev

在C中动态更改功能

来自分类Dev

未初始化的C ++结构的行为

来自分类Dev

C ++函数指针未更改