在for循环中调用fread失败

时间:2017-02-11 19:15:38

标签: c

我有以下代码(仅用于基准测试目的)。

代码包括创建一个简单的char数组,将其转储到一个文件,然后在for循环中读取它。 为什么读取函数由于fopen中的失败者而失败(fread返回NULL),但是如果我注释掉for循环会有效吗?

我正在使用Apple LLVM 8.0.0版(clang-800.0.42.1),只使用clang -o rw rw.cpp进行编译

int create(int, char**) {

    char a[256*256];
    for (int i = 0; i < 256*256; i++)
        a[i] = char(i);

    // Dump to File
    FILE* f = fopen("file.bin", "wb");
    fwrite(a, 256*256*sizeof(char), 1, f);
    fclose(f);

    return 0;
}



int read(int, char**) {

    // IF this loop is commented out, the code works. Otherwise fails
    for (int i = 0; i < 10000; i++) {

        char a[256 * 256];

        FILE* f = fopen("file.bin", "rb");

        // Fails at this assertion
        assert(f);

        fread(a, 256*256*sizeof(char), 1, f);

        for (int k = 0; k < 256 * 256; k++) {
                if (a[k] != char(k)) {
                    printf("Bad Value %d %d\n", k, a[k]);
                }
        }
    }

    return 0;

}

2 个答案:

答案 0 :(得分:4)

您永远不会关闭读取功能中for循环内打开的文件。你很可能用完了文件句柄。

答案 1 :(得分:1)

您可以将 public function getRoles() { $roleNames = []; foreach ($this->roles as $role) { $roleNames[] = $role->getRole(); } return $roleNames; } 语句移到fopen循环之外,因为只有一个文件。你不需要在循环内打开它。