在读取二进制文件时获得太多零

时间:2018-04-07 02:29:55

标签: c binaryfiles fread

我正在做一个读取整个二进制文件的程序(在我的例子中是一张图片),读取2 x 2字节并打印文件中出现的每个字节(从0000h到FFFFh)的次数,但是我有关于我捕获的零数量的问题。不确切知道它是否是一个常见的情况,但我觉得通过分配数组会出现问题。有类似的东西:

比特发生

0 62354

1 13

2 4

3 5

4 2

5 2

6 0

7 2

65535 0

你们认为我做错了什么?

按照代码:

    #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;
}

1 个答案:

答案 0 :(得分:0)

您正在分配短暂的投注,但是测量&amp;读字节。您的数组n将无法以您希望的方式运行。您需要将n的大小设置为lsize/2次(+奇数大小的边缘大小写)并相应地调整您的循环。

你的循环也非常低效!