我有以下代码(仅用于基准测试目的)。
代码包括创建一个简单的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;
}
答案 0 :(得分:4)
您永远不会关闭读取功能中for
循环内打开的文件。你很可能用完了文件句柄。
答案 1 :(得分:1)
您可以将 public function getRoles()
{
$roleNames = [];
foreach ($this->roles as $role) {
$roleNames[] = $role->getRole();
}
return $roleNames;
}
语句移到fopen
循环之外,因为只有一个文件。你不需要在循环内打开它。