C 在中读取二进制文件时获取过多的零

C 在中读取二进制文件时获取过多的零,c,binaryfiles,fread,C,Binaryfiles,Fread,我正在做一个程序,读取整个二进制文件(在我的例子中是一张图片),读取2×2个字节,并打印每个字节(从0000h到FFFFh)在文件中出现的次数,但是我在捕获的零的数量方面遇到了一个问题。不知道这是否是一种常见情况,但我觉得分配数组有问题。有点像: 位发生 0 62354 1 13 2 4 35 4.2 5.2 60 7.2 655350 你们认为我做错了什么 请遵循以下代码: #include <stdio.h> #include <stdlib.h>

我正在做一个程序,读取整个二进制文件(在我的例子中是一张图片),读取2×2个字节,并打印每个字节(从0000h到FFFFh)在文件中出现的次数,但是我在捕获的零的数量方面遇到了一个问题。不知道这是否是一种常见情况,但我觉得分配数组有问题。有点像:

位发生

0 62354

1 13

2 4

35

4.2

5.2

60

7.2

655350

你们认为我做错了什么

请遵循以下代码:

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

int main()
{
unsigned short int *n;
int cont=0;
long lsize,i,j;

FILE *arq=fopen("C:\\Users\\NB\\Documents\\Testes Allegro\\Trabalho PAQ\\imagens\\426.png","rb");
FILE *out=fopen("saida.csv","w");

fseek(arq,0,SEEK_END);
lsize=ftell(arq);
rewind(arq);

n=(unsigned short int*)malloc(sizeof(unsigned short int)*lsize);
fread(n,sizeof(short int),lsize,arq);
fprintf(out,"bit,quantidade\n");
for(i=0x0000;i<=0xffff;i++)
{
    for(j=0;j<lsize;j++)
    {
        if(n[j]==i)
            cont++;
    }
fprintf(out,"%li,%d\n",i,cont);
printf("%li,%d-",i,cont);
cont=0;
}
fclose(arq);
fclose(out);
free(n);
return 0;
}
#包括
#包括
int main()
{
无符号短整数*n;
int cont=0;
long-lsize,i,j;
文件*arq=fopen(“C:\\Users\\NB\\Documents\\Testes Allegro\\Trabalho PAQ\\images\\426.png”,“rb”);
文件*out=fopen(“saida.csv”,“w”);
fseek(arq,0,SEEK_END);
lsize=ftell(arq);
倒带(arq);
n=(无符号短整型*)malloc(sizeof(无符号短整型)*lsize);
fread(n,sizeof(short int),lsize,arq);
fprintf(输出,“位,量”\n);

对于(i=0x0000;i您正在分配短整数,但正在测量和读取字节。您的数组
n
将无法以您想要的方式工作。您需要调整
n
lsize/2
时间(+奇数大小的边缘大小写)并相应地调整循环


你的循环效率也很低!

你完全正确!短int是一种2字节的数据类型,所以我的意思是……我认为这是一种正确的方法。因此,我可以理解为什么数组的大小为lsize/2,因为lsize是文件的字节总数。非常感谢你的澄清!我如何改进循环行?好的,dep在结束您正试图执行的操作之前,我将声明一个由65536个整数组成的数组,将它们归零,然后以整数逐个整数的形式读取该文件,并在读取的int的索引处递增该数组。