C文本文件处理 fgets读取每行数据并处理

需要解决的问题:有一个文本,每行由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;
    }      
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值