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
相关产品推荐
相关产品推荐

