帮小弟我看看读入二进制文件,这一堆数字哪里来的
帮我看看读入二进制文件,这一堆数字哪里来的。
#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了,文件中话,他是怎么回事。
------解决思路----------------------
#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;
//...
}
类似的例子还可以举很多。