C语言如何从文件中使用long long类型整数搜索对应记录
C语言按12位长整型身份证号搜索文件记录解决方案
错误原因
你尝试的if(identityC == line)逻辑不成立,原因是二者类型不匹配:
identityC是long long类型的数值变量line是存储整行文本的字符数组,直接写line指代的是数组的首内存地址
二者直接用==对比是拿输入的身份证数值和文本行的内存地址做比较,完全不符合业务需求。
可选实现方案
有两种常用实现思路,你可以根据你的文件存储格式选择:
- 方案1:解析文本行中的身份证号转为长整型对比
如果你的文件每行格式为[12位身份证号] [姓名] [其他预订信息],可以用sscanf从读取到的line中解析出身份证号的长整型值,再和用户输入的identityC对比即可。 - 方案2:将输入的长整型身份证号转为字符串对比
你也可以用sprintf把用户输入的long long类型身份证号转成12位的字符串,再用strncmp和行内对应位置的字符串做匹配,这种方式不需要处理数值解析的异常。
修正后的完整代码
#include <stdio.h> #include <string.h> int main() { char line[255], name[30]; long long identityC, line_id; int search_type; // 1=按身份证搜索 2=按姓名搜索 FILE* fpointer = fopen("123 Hotel Customer.txt", "r"); if (fpointer == NULL) { printf("文件打开失败,请检查文件路径是否正确"); return 1; } printf("请选择搜索方式:1-按身份证号搜索 2-按姓名搜索:"); scanf("%d", &search_type); if (search_type == 1) { printf("\n请输入您的12位身份证号:"); scanf("%lld", &identityC); // 采用方案1实现 while (fgets(line, 255, fpointer) != NULL) { // 从行首解析长整型身份证号 if (sscanf(line, "%lld", &line_id) == 1) { if (line_id == identityC) { printf("%s", line); } } } } else { printf("\n请输入您的姓名以搜索预订记录:"); scanf("%s", name); // 数组名本身就是地址,不需要加& // 修正原有feof逻辑漏洞,避免最后一行重复读取 while (fgets(line, 255, fpointer) != NULL) { if (strncmp(name, line, strlen(name)) == 0) printf("%s", line); } } fclose(fpointer); return 0; }
注意事项
- 原有代码中的
while (!feof(fpointer))写法存在逻辑漏洞,会导致最后一行重复读取,替换为while (fgets(line, 255, fpointer) != NULL)即可避免该问题 - 如果你的文件中身份证号不是放在行首,需要调整
sscanf的格式串匹配对应的字段位置 - 12位数字完全在
long long的取值范围内,不需要担心数值溢出问题
内容的提问来源于stack exchange,提问作者Hazim Naufal
相关产品推荐
相关产品推荐

