C语言如何获取文件流行数?高效验证CSV彩票号码有效性
嘿,针对你处理50万行CSV的需求,直接逐行遍历统计行数确实太耗时间了,我给你几个高效的解决方案,顺便帮你完善号码验证函数:
高效获取CSV文件行数的方法
方案1:文件指针跳转+统计换行符(跨平台、高效)
这个方法通过直接定位到文件末尾获取大小,再逐字符统计换行符,避免了逐行解析的开销,适合大文件。唯一要注意的是,如果你的CSV里有带换行的引号字段(比如某单元格内容包含换行),这个方法会统计错误,但如果是普通的CSV格式(无复杂多行字段),完全适用。
代码示例:
#include <stdio.h> #include <stdlib.h> long get_csv_line_count(const char *filename) { FILE *file = fopen(filename, "r"); if (!file) { perror("Failed to open CSV file"); return -1; } // 跳转到文件末尾 if (fseek(file, 0, SEEK_END) != 0) { perror("Failed to move to file end"); fclose(file); return -1; } long file_size = ftell(file); if (file_size == -1) { perror("Failed to get file size"); fclose(file); return -1; } // 回到文件开头 rewind(file); long line_count = 0; int prev_char = '\0'; // 逐字符读取统计换行(比fgets快,减少字符串处理) for (long i = 0; i < file_size; i++) { int c = fgetc(file); if (c == '\n') { line_count++; } prev_char = c; } // 处理最后一行没有换行的情况 if (file_size > 0 && prev_char != '\n') { line_count++; } fclose(file); return line_count; }
方案2:调用系统工具(Linux/macOS专属,极致高效)
如果你的程序只在类Unix系统运行,可以直接调用系统自带的wc -l命令,它是专门做行数统计的,底层实现非常高效。不过要注意文件名含特殊字符(比如空格)时需要转义。
代码示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> long get_csv_line_count_system(const char *filename) { char cmd[256]; // 注意:如果文件名有空格,要加引号,比如改成 "wc -l '%s'" snprintf(cmd, sizeof(cmd), "wc -l %s", filename); FILE *pipe = popen(cmd, "r"); if (!pipe) { perror("Failed to run system command"); return -1; } long line_count = 0; if (fscanf(pipe, "%ld", &line_count) != 1) { perror("Failed to read line count result"); pclose(pipe); return -1; } pclose(pipe); return line_count; }
完善你的号码验证函数
拿到CSV行数后,你可以把它作为参数传入验证函数,需要注意行数用long类型避免溢出(虽然50万行远小于int的上限,但养成好习惯):
#include <stdbool.h> // csv_line_count 是通过上面的函数获取到的CSV总行数 // 如果CSV有表头,记得把行数减1(比如 csv_line_count -=1) bool is_tip_number_valid(int tip_number, long csv_line_count) { // 有效条件:号码≥0 且 ≤ CSV总行数 return (tip_number >= 0 && tip_number <= csv_line_count); }
额外提醒
- 如果你的CSV有表头行,统计完行数后记得减1,因为投注号码应该对应数据行,而非表头。
- Windows系统下的CSV是
\r\n换行,方案1的代码会自动处理,因为只统计\n,不影响行数结果。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

