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

需要解决的问题:有一个文本,每行由16个 0到f的字符组成(64bit的数字写成十六进制表示),需要统计整个文本中0到f 十六个字符的个数。

matlab做循环运算比较慢,特别在循环次数很多的时候更慢。这时候用C更有优势。按行读取文本,我采用的是fgets()函数。

#include 
#include 
#include 
#include 
#include 

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

 

你可能感兴趣的:(计算机基础)