如何编写C语言函数计算文本文件数据集中0和1的出现概率
C语言实现数据集最后一列0/1概率统计
实现逻辑
- 直接逐行读取文本文件,无需解析前面所有列,只提取每行最后一个有效字符作为目标标识位,计算效率更高
- 累计统计0、1的出现次数以及总有效行数,最终概率为对应计数除以总行数
完整代码
#include <stdio.h> #include <string.h> #define MAX_LINE_LEN 1024 // 可按实际行最长长度调整 void count_label_probability(const char* file_path) { FILE *fp = fopen(file_path, "r"); if (fp == NULL) { printf("文件打开失败,请检查路径是否正确\n"); return; } char line_buf[MAX_LINE_LEN]; int total_lines = 0; int count_0 = 0, count_1 = 0; while (fgets(line_buf, MAX_LINE_LEN, fp) != NULL) { // 跳过空行 if (strlen(line_buf) <= 1) continue; // 去掉末尾的换行、回车符 int len = strlen(line_buf); while (len > 0 && (line_buf[len-1] == '\n' || line_buf[len-1] == '\r')) { len--; line_buf[len] = '\0'; } if (len == 0) continue; // 取最后一位作为标识位 char last_char = line_buf[len - 1]; if (last_char == '0') { count_0++; total_lines++; } else if (last_char == '1') { count_1++; total_lines++; } } fclose(fp); if (total_lines == 0) { printf("文件中无有效数据行\n"); return; } // 计算概率 double prob_0 = (double)count_0 / total_lines; double prob_1 = (double)count_1 / total_lines; printf("总有效数据行数:%d\n", total_lines); printf("标识位0出现次数:%d,概率:%.4f\n", count_0, prob_0); printf("标识位1出现次数:%d,概率:%.4f\n", count_1, prob_1); } // 测试用主函数 int main() { // 替换为你的实际txt文件路径 count_label_probability("dataset.txt"); return 0; }
测试结果(针对示例数据集)
你提供的6条示例数据中,标识位0出现5次、1出现1次,运行代码输出结果如下:
总有效数据行数:6 标识位0出现次数:5,概率:0.8333 标识位1出现次数:1,概率:0.1667
注意事项
- 若数据集行长度超过1024,调整
MAX_LINE_LEN宏定义的数值即可 - 若行末尾存在多余空白字符,可在取最后一位前增加空白字符过滤逻辑
- 概率输出的小数位数可通过修改
printf中的%.4f调整,比如保留2位改为%.2f即可
内容的提问来源于stack exchange,提问作者Exx
相关产品推荐
相关产品推荐

