编写一个程序用于统计一个英文文档中的英文单词、英文字母、数字字符、空格字符、回车字符、标点符号和其他字符的个数; 2)英文文档以txt形式存在,通过命令行参数的形式将英文文档的路径告知子任务1程序,子任务1程序完成统计后生成统计结果文件; 3)子任务1完成统计任务后,以一定的格式将统计结果保存在一个txt形式的结果文件中; 4)子任务1程序提供两种处理模式: 细节模式:该模式下子任务1程序完成统计后,将详细统计结果输出到屏幕上,同时将统计结果输出到txt结果文件中; 概要模式:子任务1程序完成统计后,将统计结果详细信息输出到txt结果文件中,仅在屏幕上输出如下概要信息: 已完成“XXXX”文件的统计,统计结果保存在文件“XX://XXXX//XXXX.txt”中! 提示语句中前面的“XXXX”表示被统计文件的文件名,后面的“XX://XXXX//XXXX.txt”表示结果文件的完整存储路径(绝对路径); 5)子任务1的结果文件的命名规范,统计结果保存格式可自行设计; 6)用户可以通过命令行参数对程序处理模式进行选择,处理逻辑自行设计。用C语言,不能通过命令行参数实现输入,而是在程序里通过scanf输入。不要命令行参数输入!!!不要!
时间: 2024-02-28 18:57:25 浏览: 264
JAVA编程:统计英文文本文件中的字符数目和单词数目
5星 · 资源好评率100%
好的,你可以参考下面的代码实现对英文文档的统计:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_FILENAME_LEN 256
#define MAX_LINE_LEN 1024
// 定义统计结果结构体
struct CountResult {
int word_count; // 英文单词个数
int letter_count; // 英文字母个数
int digit_count; // 数字字符个数
int space_count; // 空格字符个数
int newline_count; // 回车字符个数
int punct_count; // 标点符号个数
int other_count; // 其他字符个数
};
// 统计文档中的字符个数
struct CountResult count_chars(const char *filename) {
struct CountResult result = {0, 0, 0, 0, 0, 0, 0};
FILE *fp;
char line[MAX_LINE_LEN];
int c;
int i;
// 打开文件
fp = fopen(filename, "r");
if (fp == NULL) {
fprintf(stderr, "Error: cannot open file '%s'\n", filename);
exit(1);
}
// 逐行读取文件
while (fgets(line, MAX_LINE_LEN, fp) != NULL) {
// 统计每行的字符个数
for (i = 0; line[i] != '\0'; i++) {
c = line[i];
if (isalpha(c)) {
result.letter_count++;
} else if (isdigit(c)) {
result.digit_count++;
} else if (isspace(c)) {
result.space_count++;
if (c == '\n') {
result.newline_count++;
}
} else if (ispunct(c)) {
result.punct_count++;
} else {
result.other_count++;
}
}
// 统计每行的单词个数
char *p = line;
while (*p != '\0') {
// 跳过空格和标点符号
while (*p != '\0' && !isalnum(*p)) {
p++;
}
// 统计单词个数
if (*p != '\0') {
result.word_count++;
while (*p != '\0' && isalnum(*p)) {
p++;
}
}
}
}
// 关闭文件
fclose(fp);
return result;
}
int main() {
char filename[MAX_FILENAME_LEN];
struct CountResult result;
int mode;
// 读取文件名和处理模式
printf("请输入文件名:");
scanf("%s", filename);
printf("请选择处理模式(1-细节模式,2-概要模式):");
scanf("%d", &mode);
// 统计字符个数
result = count_chars(filename);
// 输出统计结果
FILE *outfp = fopen("count_result.txt", "w");
if (outfp == NULL) {
fprintf(stderr, "Error: cannot create count_result.txt\n");
exit(1);
}
if (mode == 1) { // 细节模式
printf("文件'%s'中的统计结果:\n", filename);
printf("单词个数:%d\n", result.word_count);
printf("英文字母个数:%d\n", result.letter_count);
printf("数字字符个数:%d\n", result.digit_count);
printf("空格字符个数:%d\n", result.space_count);
printf("回车字符个数:%d\n", result.newline_count);
printf("标点符号个数:%d\n", result.punct_count);
printf("其他字符个数:%d\n", result.other_count);
fprintf(outfp, "文件'%s'中的统计结果:\n", filename);
fprintf(outfp, "单词个数:%d\n", result.word_count);
fprintf(outfp, "英文字母个数:%d\n", result.letter_count);
fprintf(outfp, "数字字符个数:%d\n", result.digit_count);
fprintf(outfp, "空格字符个数:%d\n", result.space_count);
fprintf(outfp, "回车字符个数:%d\n", result.newline_count);
fprintf(outfp, "标点符号个数:%d\n", result.punct_count);
fprintf(outfp, "其他字符个数:%d\n", result.other_count);
} else if (mode == 2) { // 概要模式
printf("已完成'%s'文件的统计,统计结果保存在文件'count_result.txt'中!\n", filename);
fprintf(outfp, "文件名:%s\n", filename);
fprintf(outfp, "单词个数:%d\n", result.word_count);
fprintf(outfp, "英文字母个数:%d\n", result.letter_count);
fprintf(outfp, "数字字符个数:%d\n", result.digit_count);
fprintf(outfp, "空格字符个数:%d\n", result.space_count);
fprintf(outfp, "回车字符个数:%d\n", result.newline_count);
fprintf(outfp, "标点符号个数:%d\n", result.punct_count);
fprintf(outfp, "其他字符个数:%d\n", result.other_count);
} else {
fprintf(stderr, "Error: invalid mode '%d'\n", mode);
exit(1);
}
// 关闭文件
fclose(outfp);
return 0;
}
```
上面的代码中,我们定义了一个结构体CountResult用于存储统计结果。然后我们实现了一个count_chars函数,用于统计文件中的字符和单词个数。最后,根据用户选择的处理模式,输出统计结果到屏幕和结果文件中。
需要注意的是,在从scanf函数中读取字符串时,我们需要使用%s格式字符串,并且需要确保读取到的字符串不超过MAX_FILENAME_LEN的长度。
阅读全文