word frequency counter in c code example
Example: word frequency analysis c program
#include <stdbool.h>#include <stdio.h>#include <glib.h> typedef struct word_count_tag { const char* word; size_t count;} word_count; int compare_word_count(const void* p1, const void* p2) { const word_count* w1 = p1; const word_count* w2 = p2; if (w1->count > w2->count) return -1; if (w1->count < w2->count) return 1; return 0;} bool get_top_words(const char* filename, size_t count) { GError* error = NULL; GMappedFile* mapped_file = g_mapped_file_new(filename, FALSE, &error); if (mapped_file == NULL) { fprintf(stderr, "%s\n", error->message); g_error_free(error); return false; } const char* text = g_mapped_file_get_contents(mapped_file); if (text == NULL) { fprintf(stderr, "File %s is empty\n", filename); g_mapped_file_unref(mapped_file); return false; } gsize file_size = g_mapped_file_get_length(mapped_file); // Store word counts in a hash table GHashTable* ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); GRegex* regex = g_regex_new("\\w+", 0, 0, NULL); GMatchInfo* match_info; g_regex_match_full(regex, text, file_size, 0, 0, &match_info, NULL); while (g_match_info_matches(match_info)) { char* word = g_match_info_fetch(match_info, 0); char* lower = g_utf8_strdown(word, -1); g_free(word); size_t* count = g_hash_table_lookup(ht, lower); if (count != NULL) { ++*count; g_free(lower); } else { count = g_new(size_t, 1); *count = 1; g_hash_table_insert(ht, lower, count); } g_match_info_next(match_info, NULL); } g_match_info_free(match_info); g_regex_unref(regex); g_mapped_file_unref(mapped_file); // Sort words in decreasing order of frequency size_t size = g_hash_table_size(ht); word_count* words = g_new(word_count, size); GHashTableIter iter; gpointer key, value; g_hash_table_iter_init(&iter, ht); for (size_t i = 0; g_hash_table_iter_next(&iter, &key, &value); ++i) { words[i].word = key; words[i].count = *(size_t*)value; } qsort(words, size, sizeof(word_count), compare_word_count); // Print the most common words if (count > size) count = size; printf("Top %lu words\n", count); printf("Rank\tCount\tWord\n"); for (size_t i = 0; i < count; ++i) printf("%lu\t%lu\t%s\n", i + 1, words[i].count, words[i].word); g_free(words); g_hash_table_destroy(ht); return true;} int main(int argc, char** argv) { if (argc != 2) { fprintf(stderr, "usage: %s file\n", argv[0]); return EXIT_FAILURE; } if (!get_top_words(argv[1], 10)) return EXIT_FAILURE; return EXIT_SUCCESS;}