用C语言写一个可以运行的代码: 输入:文件(大小10M以上) 通过文件搜集整理出一份词典,按照升序输出文件中每个单词出现的频率到文件(单词频度.txt)
时间: 2024-12-20 11:23:59 浏览: 25
在C语言中,处理大文件并创建一个简单的词频统计程序可能会涉及到文件操作、字符串处理以及计数功能。下面是一个基本的示例,它将遍历大文件(假设名为`input.txt`),统计每个单词的出现次数,并将结果保存到另一个文本文件`word_freq.txt`中:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE 4096 // 读取文件的缓冲区大小
void clean_string(char* str);
char* read_word(char* buffer);
int count_words(char* filename, char* output_filename);
int main() {
char input_filename[] = "input.txt";
char output_filename[] = "word_freq.txt";
if (count_words(input_filename, output_filename)) {
printf("Word frequency statistics have been written to %s.\n", output_filename);
} else {
printf("Failed to process the file or write the output.\n");
}
return 0;
}
// 清理字符串,移除标点符号和转换为小写
void clean_string(char* str) {
int i = 0;
while (str[i]) {
if (isalnum(str[i])) { // 如果字符是字母或数字
str[i] = tolower(str[i]); // 转换为小写
} else {
str[i] = ' '; // 将非字母数字字符替换为空格
}
i++;
}
str[i] = '\0'; // 结束字符串
}
// 从缓冲区中读取并返回单词
char* read_word(char* buffer) {
char* word = strtok(buffer, "\n"); // 分割行
if (word == NULL) {
return NULL; // 没有更多的单词了
}
clean_string(word); // 清理并返回单词
return word;
}
// 统计并输出词频
int count_words(char* filename, char* output_filename) {
FILE* in_file = fopen(filename, "r");
FILE* out_file = fopen(output_filename, "w");
if (!in_file || !out_file) {
perror("Error opening files.");
return 1;
}
char buffer[BUFFER_SIZE];
while (fgets(buffer, sizeof(buffer), in_file)) {
char* word = read_word(buffer);
if (word != NULL) {
fprintf(out_file, "%s: %d\n", word, ++word_count[word]);
}
}
fclose(in_file);
fclose(out_file);
return 0;
}
```
注意:这个示例假定输入文件中的单词是以空格分隔的。实际的大文件处理可能会更复杂,涉及内存管理、错误检查以及性能优化,特别是在处理非常大的文件时。
阅读全文