需要解决的问题:有一个文本,每行由16个 0到f的字符组成(64bit的数字写成十六进制表示),需要统计整个文本中0到f 十六个字符的个数。
matlab做循环运算比较慢,特别在循环次数很多的时候更慢。这时候用C更有优势。按行读取文本,我采用的是fgets()函数。
#include <stdint.h>
#include <stdio.h>
#include <stdint.h>
#include <memory.h>
#include <ctype.h>
int main(){
FILE* fp = fopen("a.txt","r");
if(fp == NULL){
printf("Error: read file failure.\n");
exit(-1);
}
char txt[1000] = {0}; //存储每行的字符串
uint64_t stat[16] = {0}; //统计
char sample[16] = {'0', '1', '2', '3',
'4', '5', '6', '7',
'8', '9', 'a', 'b',
'c', 'd', 'e', 'f'};
int i,j;
while(!feof(fp)){
memset(txt, 0, sizeof(txt));
fgets(txt, sizeof(txt-1), fp); //读取一行字符串
if(strlen(txt) != 17) //防止出现异常行
continue;
for(i = 0; i < 16; i++){
for(j = 0; j < 16; j++){
if(txt[i] == sample[j]
stat[j]++;
break;
}
}
}
fclose(fp);
for(i = 0; i < 16; i++){
printf("%u\n", stat[i]);
}
}
如果是按2bit统计,那么只需要修改中间部分代码
char sample[4] = {0, 1, 2, 3};
int data, index;
for(i = 0; i < 16; i++){
if(isdigit(txt[i])
data = txt[i] - 48;
else if(isupper(txt[i])
data = txt[i] - 55;
else
data = txt[i] - 87;
index = data & 0x3;
for(j = 0; j < 4; j++){
if(index == sample[j]){
stat[j]++;
break;
}
}
index = (data & 0xc)>>2; //记得右移2位
for(j = 0; j < 4; j++){
if(index == sample[j]){
stat[j]++;
break;
}
}
}