C语言从每行格式为字符+double的文件中仅读取双精度浮点数的方法
最优实现方案(按常用编程语言分类)
最优实现取决于使用的开发语言,以下是主流场景的最优写法:
1. C语言(性能优先场景)
直接利用标准IO库的格式匹配能力跳过不需要的内容,不需要手动处理换行、空格等空白字符,fscanf会自动识别并跳过所有空白字符,格式串中用%*c匹配并丢弃行首的单个char字符,直接读取double值即可,性能最高适合大文件场景:
#include <stdio.h> int main() { FILE *fp = fopen("data.txt", "r"); if (!fp) { perror("文件打开失败"); return 1; } double val; // 格式串说明:%*c匹配并丢弃单个字符,%lf读取双精度浮点数 while (fscanf(fp, "%*c %lf", &val) == 1) { // 此处处理读取到的浮点数val printf("%lf\n", val); } fclose(fp); return 0; }
优势:不需要额外分配行缓冲区,IO次数少,性能最优,自动适配换行、多空格等空白符场景。
2. Python(快速开发场景)
逐行迭代处理不会一次性加载整个文件到内存,大小文件都适用,代码简洁:
double_list = [] with open("data.txt", "r", encoding="utf-8") as f: for line in f: # 按空白符分割后取第二个元素转浮点型 num = float(line.split()[1]) double_list.append(num)
小文件场景可以直接用列表推导式简化写法:
double_list = [float(line.split()[1]) for line in open("data.txt", "r")]
优势:开发效率高,语法简洁,默认自动处理换行符。
特殊场景适配
如果行首不是单个char而是任意长度的字符串,只要分隔符是空白符,只需调整对应格式匹配规则即可:
- C语言中将
%*c替换为%*s,即可丢弃行首任意长度的非空白字符串 - Python写法无需调整,
split()默认按任意空白符分割取第二个元素即可
内容的提问来源于stack exchange,提问作者DanielG
相关产品推荐
相关产品推荐

