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