使用 2 字节缓冲区从二进制文件中读取字节
Reading bytes from binary file with 2 byte buffer
我目前正在尝试读取文件并计算 1 字节等效数字(0 到 255)的频率。我想对 2 字节等效数字(0 到 65535)做同样的事情
我拥有的简化版:
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
首先纠正一下你说的。截至目前,您还没有打印 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\n", i, freq[i]);
}
return 0;
}
我目前正在尝试读取文件并计算 1 字节等效数字(0 到 255)的频率。我想对 2 字节等效数字(0 到 65535)做同样的事情
我拥有的简化版:
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
首先纠正一下你说的。截至目前,您还没有打印 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\n", i, freq[i]);
}
return 0;
}