2012-10-18 77 views
0

在此程序中,我想打印出文件中不同字符的實例。輸出將包含三個變量,出現次數,字母的十六進制和字母本身。有人可以幫我弄這個嗎?我卡住了!在文件中查找不同字符的實例

Results of program should be something like this: 
10 instance of character 0x4s (O) 
10 instance of character 0x51 (W) 
10 instance of character 0x51 (Y) 
2 instances of character 0x65 (a) 
18 instances of character 0x67 (c) 
16 instances of character 0x81 (d) 


//here is my program. 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

const char FILE_NAME[] = "input.txt"; 


int main(argc, *argv[]) { 

    char temp; 
    char count[255]; 

FILE *in_file; 
int ch; 

fp = fopen(FILE_NAME, "r"); 
if (in_file == NULL) { 
    printf("Can not open %s \n", FILE_NAME); 
    exit(0); 
} 

while (!feof(fp)) { 

    ch = fgetc(fp); 

if(strchr(count, ch)!= NULL) 
{ 

} 

} 
printf("%d instance of character (%c)", count); 


fclose(in_file); 
return (0); 
} 

回答

0

你的陣列count不是一個字符串,因此使用strchr()它是不是一個好主意。此外,它的類型爲char,所以它對於較大文件的範圍非常有限。

您應該使用類似unsigned long count[256]的東西。確保在開始之前將計數初始化爲0。

此外,請勿使用feof()。只需循環調用fgetc(),直到返回的字符(其正確地具有類型int)爲EOF。在使用它來索引count以增加值之前,將它轉換爲正值。

1

這裏有你想要的(根據你的代碼,通過我許多意見):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> // you need this to use isupper() and islower() 

const char FILE_NAME[] = "input.txt"; 

int main(int argc,char *argv[]) { 
    char temp; 
    unsigned count[52] = {0}; // An array to store 52 kinds of chars 
    FILE *fp; 
    int i; 

    fp = fopen(FILE_NAME, "r"); 
    if (fp == NULL) { 
     printf("Can not open %s \n", FILE_NAME); 
     exit(0); 
    } 

    while((temp = fgetc(fp)) != EOF) { // use this to detect eof 
     if(isupper(temp)) 
      count[26+(temp-'A')]++; // capital letters count stored in 26-51 
     if(islower(temp)) 
      count[temp-'a']++;  // lower letters count stored in 0-25 
    } 
    fclose(fp); // When you don't need it anymore, close it immediately. 

    for(i = 0; i < 26; i++) 
     if(count[i]) 
      printf("%d instance of character 0x%x (%c)\n", count[i], 'a'+i, 'a'+i); 
    for(; i < 52; i++) 
     if(count[i]) 
      printf("%d instance of character 0x%x (%c)\n", count[i], 'A'+i-26, 'A'+i-26); 
    return (0); 
} 
+0

歡呼聲,那正是我想要 –

+0

@StevenLiu很高興提供幫助。如果您接受此答案,我將不勝感激。 – halfelf

相關問題