帮小弟我看看读入二进制文件,这一堆数字哪里来的

帮我看看读入二进制文件,这一堆数字哪里来的。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>

#define PER_line 6
#define MEM_primes 6*PER_line
struct
{
    char *filename;
    FILE *pfile;
    unsigned long long primes[MEM_primes];
    size_t count;
}global={.filename="myfile.bin",
         .pfile=NULL,
         .primes={2ULL,3ULL,5ULL},
         .count=3
};
void list_array(void);
void write_file(void);
bool is_prime(unsigned long long);
void list_primes(void);
int main(void)
{
    unsigned long long count=0ULL;
    unsigned long long num=0ULL;
    unsigned long long i=5;
    unsigned long long buffer[MEM_primes]={2ULL};
    printf("qing shuru yige shuzi,jisuan xiao yu ta de suoyou zhishu.\n");
    scanf("%llu",&num);
    while(i<num)
    {
        i+=2ULL;
        if(is_prime(i))
         {
             global.primes[global.count++]=i;
           //  printf("\n++shuzu shi :%llu",global.primes[global.count-1]);
        if(global.count==MEM_primes)
            write_file();
         }
    }
    for(int x=0;x<num;++x)
    {
        printf("%6llu",global.primes[x]);
        if((x+1)%6==0)
            printf("\n");
    }
    if(global.pfile&&global.count>0)
        write_file();


    list_primes();

    return 0;
}

bool is_prime(unsigned long long m)
{

    bool shifou=true;
        unsigned long long i=5;
        for(;i<m;++i)
        {
            if(m%i==0)
            return false;
        }

        return shifou;
}

void write_file()
{
    if(fopen_s(&global.pfile,global.filename,"ab"))
    {
        printf("jia ru wenjian shibai!");
        exit(1);
    }
    setvbuf(global.pfile,NULL,_IOFBF,BUFSIZ);
    fwrite(global.primes,sizeof(unsigned long long),global.count,global.pfile);
    fclose(global.pfile);
    global.count=0;
}

void list_primes(void)
{
    if(global.pfile)
    {
        if(fopen_s(&global.pfile,global.filename,"rb"))
        {
            printf("du qu wenjian shibai!");
            exit(1);
        }
        setvbuf(global.pfile,NULL,_IOFBF,BUFSIZ);
        while(!feof(global.pfile))
        {
            global.count=fread(global.primes,sizeof(unsigned long long),MEM_primes,global.pfile);

            list_array();
        }
        printf("\n");
        fclose(global.pfile);
    }
    else
        list_array();
}
void list_array(void)
{
    for(size_t j=0;j<global.count;++j)
    {
        printf("%10llu",global.primes[j]);
        if(((j+1)%PER_line)==0)
            printf("\n");
    }
}

将质数存入数组中,达到数组容量时,就存入到二进制文件中,然后从二进制文件中读取这些质数。编写过程中遇到两个问题:
1.我以为会出现的问题,没出现。那就是从二进制文件中读取质数时,他的数量明显时比数组定义的大小大,但是他还是能全部读出来,我在输出中加 了一个输出========,发现他是存满一次输出一次,fread函数的运行是这样的吗?
2.

帮小弟我看看读入二进制文件,这一堆数字哪里来的
超出数组大小时,就会输出一长串数字,我在中间增加了一个输出语句,运行后就出现了一长串数字。中间的那些数字是怎么出来的?不是数组中的,因为我将数组全部初始化为0了,文件中话,他是怎么回事。
------解决思路----------------------
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
 if (条件1) break;
 //...
 if (条件2) continue;
 //...
 if (条件3) return;
 //...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
while (!feof(f)) {
 a=fgetc(f);
 //...
 b=fgetc(f);//可能此时已经feof了!
 //...
}
而这样写就没有问题:
while (1) {
 a=fgetc(f);
 if (feof(f)) break;
 //...
 b=fgetc(f);
 if (feof(f)) break;
 //...
}
类似的例子还可以举很多。