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

C语言读取文件不存在数字问题及航班数据循环读取实现

嗨,咱们一步步搞定这个航班文件读取的问题吧。我会帮你补全代码,还会处理首字符不是数字这类异常情况,让你的程序更健壮。

完整实现与错误处理方案

首先得明确几个核心需求:

  • 正确打开目标文件,处理文件不存在/无法打开的情况
  • 读取文件首字符并转为整数,作为后续读取航班的循环次数
  • 处理首字符不是数字的异常场景
  • 避免航班数量超过数组上限,防止越界

1. 先补全flight_t结构体定义

因为你提到了flight_t类型,我先根据文件里的字段定义一个匹配的结构体(你可以根据实际需求调整字段名):

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h> // 用来判断字符是否为数字

#define MAX_NUM_FLIGHTS 50
// 文件里每个航班有10个详情字段(首字符的1是总航班数,不算在航班详情里)
#define FLIGHT_DETAIL_FIELDS 10

typedef struct {
    char airline_code[4];  // 对应文件里的VA1
    char seg1[3];          // 第一个01
    char seg2[3];          // 第二个01
    char seg3[3];          // 第三个01
    char seg4[3];          // 第四个01
    char bas_code[4];      // 对应文件里的BAS
    char seg5[3];          // 第五个01
    char seg6[3];          // 第六个01
    char seg7[3];          // 第七个01
    char seg8[3];          // 第八个01
} flight_t;

2. 完整的loadFlights函数实现

我调整了函数的返回值(原返回flight_t不太合理,因为要加载多个航班到数组),改成返回实际读取的航班数,方便上层逻辑判断执行结果:

int loadFlights(char flightDatabase[50], flight_t f[MAX_NUM_FLIGHTS]) {
    int total_flights = 0;
    int counter;
    FILE *fp;
    char first_char;

    // 第一步:打开文件,判断是否成功
    fp = fopen(flightDatabase, "r");
    if (fp == NULL) {
        perror("打开航班数据库文件失败");
        return -1; // 返回-1标记文件打开失败
    }

    // 第二步:读取首字符,判断是否为数字
    first_char = fgetc(fp);
    if (!isdigit(first_char)) {
        fprintf(stderr, "错误:文件首字符不是有效数字\n");
        fclose(fp);
        return -2; // 返回-2标记首字符非法
    }

    // 第三步:将字符转为整数,并检查是否在合法范围内
    total_flights = first_char - '0';
    if (total_flights <= 0 || total_flights > MAX_NUM_FLIGHTS) {
        fprintf(stderr, "错误:航班数无效(%d),必须在1到%d之间\n", 
                total_flights, MAX_NUM_FLIGHTS);
        fclose(fp);
        return -3; // 返回-3标记航班数超出范围
    }

    // 跳过首字符后面的空格(文件里首字符和航班详情之间是空格分隔)
    while (fgetc(fp) != ' ');

    // 第四步:循环读取对应数量的航班详情
    for (counter = 0; counter < total_flights; counter++) {
        // 按空格分隔读取每个字段
        int read_count = fscanf(fp, "%s %s %s %s %s %s %s %s %s %s",
                                f[counter].airline_code,
                                f[counter].seg1,
                                f[counter].seg2,
                                f[counter].seg3,
                                f[counter].seg4,
                                f[counter].bas_code,
                                f[counter].seg5,
                                f[counter].seg6,
                                f[counter].seg7,
                                f[counter].seg8);

        // 检查是否成功读取所有字段
        if (read_count != FLIGHT_DETAIL_FIELDS) {
            fprintf(stderr, "警告:第%d条航班数据不完整\n", counter + 1);
            fclose(fp);
            return counter; // 返回已成功读取的航班数
        }
    }

    fclose(fp);
    return total_flights; // 返回成功读取的总航班数
}

3. 关键错误处理说明

  • 文件打开失败:用perror打印系统级错误信息(比如文件不存在、权限不足),返回-1
  • 首字符非数字:用isdigit做判断,返回-2并提示非法字符
  • 航班数无效:检查是否为正整数且不超过数组最大容量,避免数组越界崩溃
  • 航班数据不完整:通过fscanf的返回值判断是否读取了所有字段,返回已读取的有效数量

4. 函数使用示例

int main() {
    flight_t flights[MAX_NUM_FLIGHTS];
    int result = loadFlights("database.txt", flights);

    if (result == -1) {
        printf("文件打开失败\n");
    } else if (result == -2) {
        printf("文件首字符不是有效数字\n");
    } else if (result == -3) {
        printf("航班数超出合法范围\n");
    } else {
        printf("成功加载%d条航班数据\n", result);
        // 打印第一条航班信息示例
        printf("第一条航班:航空公司代码%s,BAS代码%s\n", flights[0].airline_code, flights[0].bas_code);
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Angus Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:46