无法理解这段代码,如果没有使用 i 和 j,它如何遍历 for 循环?

Having trouble understanding this code, how is it iterating through the for loop if the i and j aren't being used?

我不明白这段代码如何遍历图像的像素,如果在读取图像时代码不使用 int i 或 j?编码新手和文件操作新手,所以这就是我如此无能为力的原因。谢谢你。

// iterate over infile's scanlines
    for (int i = 0, biHeight = abs(bi.biHeight); i < biHeight; i++)
    {
        // iterate over pixels in scanline
        for (int j = 0; j < bi.biWidth; j++)
        {

            // temporary storage
            RGBTRIPLE triple;

            // read RGB triple from infile
            fread(&triple, sizeof(RGBTRIPLE), 1, inptr);


        }
        // skip over padding, if any
        fseek(inptr, padding, SEEK_CUR);

        // then add it back (to demonstrate how)
        for (int k = 0; k < padding; k++)
        {
            fputc(0x00, outptr);
        }

    }

内部循环确实以常规方式使用 j,尽管它不是在循环内部读取的。它仍然被迭代并在条件中使用。

带有 i 的外部循环实际上并没有使用 i 但条件在每次迭代中仍然会发生变化,因此它仍然应该退出。该用例通常使用 while 循环完成。

fread这样的函数是用来处理文件的。

出于各种原因,其中一些是历史原因,这些函数的结构采用 "file pointer" 或 FILE

FILE 包含有关它当前指向哪个文件的信息,它的长度以及关键的 在它指向的文件中的位置。当您使用特定的 size/nmemb(这意味着 "number of members")组合调用 fread 时,它将 内部 递增 FILE 没有你的帮助。

事实上,正如您的程序稍后显示的那样,访问文件任意区域的唯一方法是查找 (fseek) 到它们。

就像下面这个函数实际上并没有使用i来增加它的值,它只是在堆栈帧内部有关于num的信息mainincrement 到 运行 的内部逻辑。

void increment(int *num) {
    *num = *num + 1;
}

int main() {
    int num = 0;
    for (int i = 0; i < 100; i++) {
        increment(&num);
    }
    printf("%d\n", num); // this prints 100
}

这种处理文件输入/输出的方式是所谓文件通用模型的一部分 I/O,它在基于 Unix 的操作系统哲学中扮演着绝对关键的角色,例如 Mac OSX 和 Linux 并且在后来的一些改进这些系统的尝试中更为重要,例如 Plan9

如果你想成为一名熟练的程序员,通过阅读 "The Linux Programming Interface", "The Art of Unix Programming", "Advanced Programming in the Unix Environment" 等书籍来理解这些 API 的概念及其背后的原因是至关重要的