在文件中查找不同字符的实例

时间:2012-10-18 09:02:34

标签: c

在这个程序中,我想打印出文件中不同字符的实例。输出将包含三个变量,出现次数,字母的十六进制和字母本身。有人可以帮我弄这个吗?我被卡住了!

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

您的数组count不是字符串,因此使用strchr()不是一个好主意。此外,它的类型为char,因此它对于较大的文件的范围非常有限。

您应该使用类似unsigned long count[256]的内容。确保在开始之前将计数初始化为0.

另外,请勿使用feof()。只需循环调用fgetc(),直到返回的字符(正确地,类型为int)为EOF。在使用它作为增量的count索引之前,将其转换为积极的东西。