c - 在函数调用之间保留文件指针

标签 c file-io binaryfiles

我有一段代码可以多次访问一个二进制文件。每次我调用该函数时,它都会打开文件进行读取,并且只读出所需的字节数(比如每次 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/

相关文章:

c - 为什么数组的元素比类型大?

java - 如何读取文本文件中的字符并获取字符长度?

c++ - 使用 std::string 打开文件

c++ - 从输入文件写入输出文件

python - 复杂二进制分析 - 位翻转并写入二进制文件 (Python)

c# - 从文件中高效读取结构化二进制数据

c# - 如何使用 C# 从二进制文件中读取浮点值?

c++ - 为什么要指定指针类型?

c - 有没有办法告诉C永远不要动态分配内存?

c - 如何解释位右移两个不同的结果?