如何用C语言读取TXT文件并将学生信息存储到RECORD数据结构中?
解决C语言读取学生信息文本文件的问题
嘿,刚好我之前处理过类似的场景,这两个问题其实都可以用C语言标准库的输入函数轻松解决,我给你一步步讲清楚:
第一步:先定义你的RECORD数据结构
首先咱们得先把存储学生信息的结构体定义好,根据你的需求,大概是这样:
#include <stdio.h> #include <stdlib.h> #define MAX_NAME_LEN 50 // 定义学生记录结构体 typedef struct { int studentID; // 假设学生ID是整数,要是带字母的学号就改成char数组 char firstName[MAX_NAME_LEN]; char lastName[MAX_NAME_LEN]; int score; // 分数如果是小数就改成float/double } RECORD;
问题1:按空格分隔读取各个字段
C语言的fscanf()函数天生就适合处理空白字符分隔的输入(空格、换行、制表符都算空白),它会自动跳过这些分隔符,直接读取对应格式的内容。
比如你的文本文件每一行是这样的格式:
1001 Alice Smith 85 1002 Bob Johnson 92
那我们可以直接用fscanf()指定格式字符串,一次性读取四个字段。
问题2:自动换行读取下一位学生
fscanf()会自动忽略换行符(属于空白字符),所以当你读完一行的四个字段后,下一次调用fscanf()会直接跳到下一行的第一个字段,完全不用手动处理换行!
方法1:直接用fscanf循环读取(简单高效)
这种方法适合确定文件格式完全规范的情况:
int main() { FILE *fp = fopen("students.txt", "r"); if (fp == NULL) { perror("无法打开文件"); return 1; } RECORD students[100]; // 假设最多存储100个学生,也可以用动态分配内存 int count = 0; int read_result; // 循环读取直到文件结束 while ((read_result = fscanf(fp, "%d %s %s %d", &students[count].studentID, students[count].firstName, students[count].lastName, &students[count].score)) != EOF) { // 检查是否成功读取了4个字段(避免格式错误的行) if (read_result == 4) { count++; } else { printf("警告:第%d行格式错误,跳过\n", count+1); // 跳过当前行的剩余内容,避免卡住 char temp[100]; fgets(temp, sizeof(temp), fp); } } // 打印读取到的学生信息,验证结果 printf("共读取到%d位学生信息:\n", count); for (int i = 0; i < count; i++) { printf("ID: %d, 姓名: %s %s, 分数: %d\n", students[i].studentID, students[i].firstName, students[i].lastName, students[i].score); } fclose(fp); return 0; }
方法2:逐行读取+解析(更严谨,适合格式可能有波动的情况)
如果担心文件里有格式不规范的行(比如某一行多了空格、少了字段),可以先用fgets()读取整行,再用sscanf()解析这一行的内容:
int main() { FILE *fp = fopen("students.txt", "r"); if (fp == NULL) { perror("无法打开文件"); return 1; } RECORD students[100]; int count = 0; char line[200]; // 存储整行内容,大小要足够容纳最长的行 while (fgets(line, sizeof(line), fp) != NULL) { // 解析当前行的内容 if (sscanf(line, "%d %s %s %d", &students[count].studentID, students[count].firstName, students[count].lastName, &students[count].score) == 4) { count++; } else { printf("警告:第%d行格式错误,跳过\n", count+1); } } // 验证输出部分和上面一样 printf("共读取到%d位学生信息:\n", count); for (int i = 0; i < count; i++) { printf("ID: %d, 姓名: %s %s, 分数: %d\n", students[i].studentID, students[i].firstName, students[i].lastName, students[i].score); } fclose(fp); return 0; }
几个注意事项
- 如果你学生ID是字符串(比如带字母的学号),把
int studentID改成char studentID[20],然后格式字符串里的%d换成%s就行。 - 定义名字数组的时候,要给足够的长度,避免溢出。
- 一定要检查文件是否成功打开,避免空指针错误。
- 记得最后关闭文件,释放资源。
内容的提问来源于stack exchange,提问作者Vasillis Kontis
相关产品推荐
相关产品推荐

