You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 22:22:42