读取文件时最后一个对象重复输出问题技术求助
嘿,这问题我之前帮人排查过好多次——读取文件每行映射到Student类时,总是多输出一遍最后一条记录,大概率是循环读取的逻辑判断出了问题,我给你捋捋最常见的几个坑和解决办法:
1. 别用feof()来控制循环(最容易踩的坑!)
很多新手会这么写代码:
Student s; while (!feof(file_ptr)) { // 读取文件字段到s的成员变量里 fscanf(file_ptr, "%d %s %s %s %s %f", &s.id, s.lastName, s.firstName, s.birthday, s.major, &s.gpa); // 输出当前Student对象 printStudentInfo(s); }
这写法的问题在于:feof()是在读取操作失败后才会触发,当程序读完最后一行有效数据后,下一次fscanf会尝试读取文件末尾的无效内容,读取失败,但此时feof()才会置位,而你已经执行了printStudentInfo(s),输出的就是上一次读取的最后一条Student数据!
正确的写法是把读取操作直接放到循环条件里,判断是否成功读取了所有字段:
Student s; // 因为你要读取6个字段(IDS、姓氏、名字、生日、专业、GPA),所以判断返回值是否等于6 while (fscanf(file_ptr, "%d %s %s %s %s %f", &s.id, s.lastName, s.firstName, s.birthday, s.major, &s.gpa) == 6) { // 只有成功读取全部字段,才输出和处理这个Student对象 printStudentInfo(s); }
2. 检查文件末尾是否有多余内容
打开你的1.txt看看,是不是最后一行后面还有空行、多余的空格或者换行符?如果有的话,程序会尝试读取这部分无效内容,虽然读取失败,但如果循环逻辑没处理好,就会重复输出最后一条有效记录。解决办法除了上面的循环判断,也可以手动清理文件末尾的多余空白。
3. 确认Student对象的初始化逻辑
如果你的Student类/结构体没有在每次循环前初始化成员变量,极端情况下可能残留上一次的数据(不过这种情况一般不会只重复最后一条,但也可以排查下)——比如每次循环开始时,把Student的成员都置空或者初始化一遍。
要是你能把那部分代码贴出来,我还能帮你更精准地定位问题~
内容的提问来源于stack exchange,提问作者Prophed
相关产品推荐
相关产品推荐

