C语言如何从文本文件提取并存储数据为变量?
解析文本文件提取结构化数据的C语言实现
你现在用fgetc逐字符读取文件来解析结构化数据确实效率低且繁琐,完全没必要。针对你的需求——把城市名存入字符串变量、经纬度存入double变量,直接用格式匹配类函数就能实现,无需手动处理字符转换。下面给你两种实用方案:
方案1:直接用fscanf按格式读取
如果你的cities.dat里每行数据格式固定为城市名 纬度 经度(例如New_York 40.6638332 -73.938484),可以直接用fscanf匹配格式,一次性把数据读入对应变量:
#include <stdio.h> #define MAX_CITY_NAME 50 // 定义城市名的最大长度 int main() { FILE *cities = fopen("cities.dat", "r"); if (NULL == cities) { printf("Invalid File. :(\n"); return 1; // 文件打开失败直接退出 } printf("File Found!\n"); char city_name[MAX_CITY_NAME]; double latitude, longitude; // 循环读取每行数据,直到文件结束或读取失败 while (fscanf(cities, "%s %lf %lf", city_name, &latitude, &longitude) == 3) { // 这里可以对变量做后续处理,比如打印验证 printf("城市:%s,纬度:%f,经度:%f\n", city_name, latitude, longitude); } fclose(cities); return 0; }
方案2:fgets读整行 + sscanf解析(更安全)
如果文件中存在格式不规整的行,或者你需要先对整行内容做预处理,建议先用fgets读取整行,再用sscanf解析该行内容,避免fscanf自动跳过换行、空格等带来的问题:
#include <stdio.h> #include <string.h> #define MAX_CITY_NAME 50 #define MAX_LINE_LEN 100 // 定义每行的最大长度 int main() { FILE *cities = fopen("cities.dat", "r"); if (NULL == cities) { printf("Invalid File. :(\n"); return 1; } printf("File Found!\n"); char line[MAX_LINE_LEN]; char city_name[MAX_CITY_NAME]; double latitude, longitude; while (fgets(line, MAX_LINE_LEN, cities) != NULL) { // 解析整行内容,成功读取3个字段才处理 if (sscanf(line, "%s %lf %lf", city_name, &latitude, &longitude) == 3) { printf("城市:%s,纬度:%f,经度:%f\n", city_name, latitude, longitude); } else { printf("该行格式错误:%s", line); } } fclose(cities); return 0; }
关键说明
%s:用于读取不含空格的字符串(适合你的New_York这类带下划线的城市名);如果城市名包含空格(比如New York),需要改成%49[^\t ](限制长度避免溢出,指定分隔符为制表符或空格)。%lf:是fscanf读取double类型的格式符,打印时用%f即可。- 每次读取后检查返回值:
fscanf/sscanf返回成功匹配的字段数,返回3表示成功读取了城市名、纬度、经度三个数据,这样能过滤格式错误的行。
内容的提问来源于stack exchange,提问作者Erique
相关产品推荐
相关产品推荐

