我有一段代码可以多次访问一个二进制文件。每次我调用该函数时,它都会打开文件进行读取,并且只读出所需的字节数(比如每次 n
字节)。
二进制文件包含时间序列数据,我希望它能够通过循环运行函数调用,每次调用函数打开同一个文件时,都需要读出下一 block 数据,即我不希望每次都重置文件指针。有办法做到这一点吗?
函数如下所示:
int readBinary(float *binImage, int gelements) {
imageFile = fopen("tmpImageFile", "r");
if (imageFile == NULL) {
fprintf(stderr, "Error opening file\n");
return (1);
}
fread(binImage, sizeof(float), gelements, imageFile);
return 0;
}
在我的主要代码中,我想通过一个循环运行它,每次都给它一个大小为 gelements
的数组 binImage
。如果可以避免的话,我宁愿不给它一个大小为 gelements * nLoop
的数组。
最佳答案
快速的经验法则是
“如果您正确分离职能之间的责任,生活会变得更轻松”
和
“如果使用静态或全局变量,生活会变得复杂”。
在这种情况下,将管理FILE
和读取数据的职责赋予readBinary
函数就太过分了。
请注意,该函数不会关闭句柄。
如果句柄在函数中是局部静态的,那么将无法关闭它。 这也意味着该函数将永远被锁定为仅使用“tmpImageFile”(从函数的签名或缺少的文档中不能立即看出这一点)
如果句柄是全局句柄,则可能会过早关闭它。
请注意,如果您删除“打开文件”责任,则 readBinary
函数只是对 fread
的调用。
处理此问题的最佳方法是完全跳过 readBinary
函数。
你说你有一个循环读取数据的调用者。
让这个调用者负责打开FILE
,直接在循环中使用fread
,完成后关闭文件。
现在,这可能会给调用者太多的责任。只需让调用者接受 FILE*
作为参数并将文件管理责任交给其调用者。
或者调用者的调用者的调用者,具体取决于管理文件生命周期的意义所在。
关于c - 在函数调用之间保留文件指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16123702/