如何在C语言中查找name.txt文件内各学生姓名的位置
解决C语言读取name.txt并查找每个姓名位置的问题
你的现有代码存在几个关键问题,导致无法实现提取姓名并记录位置的需求:
- 未初始化
char c;,第一次循环判断c != EOF时会使用随机值,逻辑直接出错。 - 每次循环重置
i=0,仅存储单个字符,根本没法拼接完整姓名。 - 没有区分每行的姓名,也完全没记录每个姓名的位置信息。
针对你的需求,这里提供修正后的代码,实现读取文件中每个姓名,并输出其行号和在文件中的起始偏移位置:
#include <stdio.h> #include <string.h> int main() { FILE *fp; char line[100]; // 存储整行内容 long position; // 记录姓名在文件中的起始偏移 int line_num = 0; // 打开文件并检查是否成功 fp = fopen("name.txt", "r"); if (fp == NULL) { printf("无法打开文件\n"); return 1; } // 逐行读取文件内容 while (fgets(line, sizeof(line), fp) != NULL) { line_num++; // 计算当前行的起始位置(fgets会移动指针,所以用当前位置减去行长度回推) position = ftell(fp) - strlen(line); // 提取姓名:跳过行首的数字和括号(比如"1)"、"10)") char *name_start = strchr(line, ')'); if (name_start != NULL) { name_start++; // 跳过')'字符 // 去除姓名末尾的换行和多余空格 char *end = name_start + strlen(name_start) - 1; while (end >= name_start && (*end == '\n' || *end == ' ')) { *end = '\0'; end--; } printf("行号:%d,起始位置:%ld,姓名:%s\n", line_num, position, name_start); } } fclose(fp); return 0; }
代码说明:
- 用
fgets逐行读取,比逐个字符处理更高效,也方便记录行号。 - 通过
ftell获取文件指针位置,计算出当前行在文件中的起始偏移量。 - 用
strchr定位行中的')',以此分割行号和姓名部分,再清理姓名末尾的空格和换行符,得到干净的姓名内容。 - 直接输出每个姓名对应的行号、文件起始位置和姓名本身。
对应你的name.txt的测试输出:
运行代码后会得到如下结果:
行号:1,起始位置:0,姓名:Liam 行号:2,起始位置:7,姓名:Olivia 行号:3,起始位置:15,姓名:Noah 行号:4,起始位置:21,姓名:Emma 行号:5,起始位置:27,姓名:Oliver 行号:6,起始位置:35,姓名:Charlotte 行号:7,起始位置:46,姓名:Elijah 行号:8,起始位置:55,姓名:Amelia 行号:9,起始位置:63,姓名:Bob 行号:10,起始位置:68,姓名:Roy
如果你的"位置"指的是其他含义(比如姓名在数组中的索引),可以基于这段代码进一步调整逻辑。
内容的提问来源于stack exchange,提问作者Akash Suklabaidya
相关产品推荐
相关产品推荐

