从具有2字节缓冲区的二进制文件中读取字节

问题描述 投票:-1回答:1

我目前正在尝试读取和计算不同字节的频率,并给出2个字节的频率。问题是,它仅转到255,而我正在尝试实现最多65 535

我拥有的简化版本:

int length = 256; //any value 256>
long long values[length]
char buffer[length]
int i,nread;

fileptr = fopen("text.txt", "rb");

for (i=0; i<length; i++){ values[i]=0 }
while((nread = fread(buffer, 1, length, fileptr)) > 0){
   for(i=0;i<nread;i++){
      values[(unsigned char)buffer[i]]++;
   }
}

fclose(fileptr);

for(i=0;i<length;i++{ 
   printf("%d: %lld",i, values[i]); 
}

即时消息:

0:21

1:27

...

255:19

我期待什么:

0:4

1:2

...

65535:3

感谢您的帮助

c fopen fread
1个回答
0
投票

首先,让我纠正你所说的。截至目前,您尚未打印2字节范围的频率。通常,unsigned char是1字节(8位),您得到的结果也与我所说的8 bits => 0 <-> 2^8 -1 => 0 <-> 255

为了获得16位范围的频率,您可以使用u_int16_t,代码如下所示>>

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

int main () {
    FILE* fp = NULL;

    /* Open file and setup fp */

    int *freq = (int*) calloc(65536, sizeof(int));

    u_int16_t value;

    for ( ; ; ) {
        if (read(fileno(fp), &value, sizeof(value)) < sizeof(value)) {
            /* Assuming partial reads wont happen, EOF reached or data remaining is less than 2 bytes */
            break;
        }

        freq[value] = freq[value] + 1;
    }

    for (int i = 0; i < 65536 ; i++) {
        printf("%d : %d", i, freq[i]);
    }

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.