关于文件内部指针的问题,希望有人解答一下

问题遇到的现象和发生背景

程序目的 输入10个学生的数据到文件中,然后把偶数学生的数据输出到屏幕上
输出学生数据的程序,我将文件内部指针移动到存放第二学生数据(infor[1])的位置,然后输出,此后每次从第二个学生的位置开始每次循环向后移动两个位置再读取输出,但是为什么输出数据的时候输出的第一个偶数后面都是奇数学生的数据,明明文件内部指针已经是从第二个学生开始每次往后挪两个位置输出的不应该是按照题目要求学生的数据吗?,实在想不明白了,希望有人能解答一下

遇到的现象和发生背景,请写出第一个错误信息
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
#include
#include
#include

struct student
{
    int ID, age;
    char name[15];
}infor[10], * p;

void main()
{
    FILE* fp;
    errno_t err;
    int j=1, i;
    if ((err = fopen_s(&fp, "D:\\vs程序\\文件\\第十章课后题\\vc3.txt","wt+")) != NULL) {
        printf("cannot open file\n");
        getchar();
        exit(1);
    }
    printf("please input ID age name\n");
    for (p = infor; p < infor + 10; p++) {//输入10个学生的数据
        scanf_s("%d%d", &p->ID, &p->age);
        gets_s(p->name);
    }
    fwrite(p = infor, sizeof(struct student), 10, fp);//将10个学生的数据写入文件
    rewind(fp);//让文件内部指针重新回到文件首
    p = infor;
    printf("ID\tage\tname\n");
    fseek(fp, j * sizeof(struct student), 1);//将文件内部指针移动到存放第二学生数据(fp中存放infor[1])的位置
    fread(p, sizeof(struct student), 1, fp);
    printf("%d\t%d\t%s\n", p->ID, p->age, p->name);
    for (i = 1, j = 2; i <= 4;i++) {
        fread(p, j*sizeof(struct student), 1, fp);//从第二个学生的位置开始每次循环向后移动两个位置再读取
        printf("%d\t%d\t%s\n", p->ID, p->age,p->name);
    }
    fclose(fp);
}

运行结果及详细报错内容

img

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

我来帮你修改一下。首先,你需要将j的初始值改为2,然后在循环中每次将j加2,这样就可以从第二个学生开始往后每次移动两个位置了。修改后的代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct student
{
    int ID, age;
    char name[15];
}infor[10], * p;

int main()
{
    FILE* fp;
    errno_t err;
    int j=2, i;
    if ((err = fopen_s(&fp, "D:\\vs程序\\文件\\第十章课后题\\vc3.txt","wt+")) != NULL) {
        printf("cannot open file\n");
        getchar();
        exit(1);
    }
    printf("please input ID age name\n");
    for (p = infor; p < infor + 10; p++) {
        scanf_s("%d%d", &p->ID, &p->age);
        gets_s(p->name);
    }
    fwrite(p = infor, sizeof(struct student), 10, fp);
    rewind(fp);
    p = infor;
    printf("ID\tage\tname\n");
    fseek(fp, j * sizeof(struct student), 1);
    fread(p, sizeof(struct student), 1, fp);
    printf("%d\t%d\t%s\n", p->ID, p->age, p->name);
    for (i = 1; i <= 4; i++) {
        fseek(fp, j * sizeof(struct student), 1);
        fread(p, sizeof(struct student), 1, fp);
        printf("%d\t%d\t%s\n", p->ID, p->age, p->name);
        j += 2;
    }
    fclose(fp);
    getchar();
    return 0;
}