文件内部有信息但输出不出来

这是一个学生信息管理系统的东西,文件已经存储数据了,但是用输出函数输出不出来,想问一下问题在哪里?

typedef struct studentmessage
{
    int number;
    char name[20];
    char sex;
    char address[30];
}STU;
void show_studentmessage()
{
    STU students[1000];
    FILE *fp;
    fp=fopen("file1.txt","r");
    if(fp==NULL)
    {
        printf("打开文件失败");
        exit(1); 
    }
    int i=0,j=0;
    while(!feof(fp))
    {
        fread(&students[i],sizeof(STU),1,fp);
        printf("%-6d%-6s%-6s%-6s%",students[j].number,students[j].name,students[j].sex,students[j].address);
        printf("\n");
        i++;
    }
    i--;
    for(j=0;j<=i;j++)
    {
        printf("%-6d%-6s%-6s%-6s%",students[j].number,students[j].name,students[j].sex,students[j].address);
        printf("\n");
    }
    fclose(fp);
}

这是输出函数

img

img

有两个问题可能导致输出不出来。
1、在输出的格式字符串中,最后一个%号多余,应该删除。
2、在读取文件时,应该先判断是否读到了文件末尾,然后再进行读取和输出。
修改后的代码如下:

typedef struct studentmessage
{
    int number;
    char name[20];
    char sex;
    char address[30];
}STU;

void show_studentmessage()
{
    STU students[1000];
    FILE *fp;
    fp=fopen("file1.txt","r");
    if(fp==NULL)
    {
        printf("打开文件失败");
        exit(1); 
    }
    int i=0,j=0;
    while(!feof(fp))
    {
        if (fread(&students[i],sizeof(STU),1,fp) == 1) {
            printf("%-6d%-6s%-6c%-6s",students[j].number,students[j].name,students[j].sex,students[j].address);
            printf("\n");
            i++;
        }
    }
    i--;
    for(j=0;j<=i;j++)
    {
        printf("%-6d%-6s%-6c%-6s",students[j].number,students[j].name,students[j].sex,students[j].address);
        printf("\n");
    }
    fclose(fp);
}

修改后,可以运行函数 show_studentmessage 来查看存储在文件中的学生信息

程序修改如下试下:

typedef struct studentmessage
{
    int number;
    char name[20];
    char sex;
    char address[30];
}STU;
void show_studentmessage()
{
    STU students[1000];
    FILE *fp;
    fp=fopen("file1.txt","r");
    if(fp==NULL)
    {
        printf("打开文件失败");
        exit(1); 
    }
    int i=0,j=0;
    while( fread(&students[i],sizeof(STU),1,fp)>0)
    {
        printf("%-6d%-6s%-6s%-6s%",students[j].number,students[j].name,students[j].sex,students[j].address);
        printf("\n");
        i++;
    }
    i--;
    for(j=0;j<=i;j++)
    {
        printf("%-6d%-6s%-6s%-6s%",students[j].number,students[j].name,students[j].sex,students[j].address);
        printf("\n");
    }
    fclose(fp);
}