PHP文件读写处理实操:成绩提分脚本运行结果与预期不符求助
问题分析
- 错误修改原文件:使用
w模式打开原成绩文件grades.txt并写入内容,直接覆盖了原始成绩数据,需求不需要修改原文件,属于多余的错误操作。 - 未保存计算后的新成绩:两次遍历都使用的是最开始读取的原始成绩数组
$read_start,第一次遍历调用raise()计算的新成绩没有存储,第二次写入results.txt和打印的都是原始成绩,和需求不符。 raise()函数返回值格式不一致:成绩为5时返回纯数字5,不带换行符,其他成绩返回带换行的字符串,会导致写入文件时5对应的行没有换行,格式错误。- 未处理读取内容的换行符:
file()函数读取的每行内容默认携带末尾换行符,直接参与计算/比较存在隐式类型转换的风险。 - 输出顺序错误:先执行的逻辑意外触发了新成绩输出,
New grades:标识打印位置靠后,和预期输出顺序不符。
修正后代码
<?php // 成绩提升逻辑,统一返回带换行的字符串 function raise($n) { // 先转成整数,去掉读取时带的换行/空格 $num = intval(trim($n)); if ($num === 5) { return "5\n"; } return ($num + 1) . "\n"; } // 只读原始成绩,不修改原文件 $grades = file('grades.txt'); // 存储计算后的新成绩 $newGrades = []; foreach ($grades as $grade) { $newGrades[] = raise($grade); } // 写入新成绩到results.txt $endFile = fopen('results.txt', 'w'); foreach ($newGrades as $newGrade) { fwrite($endFile, $newGrade); } fclose($endFile); // 打印输出结果 echo "New grades:\n"; foreach ($newGrades as $newGrade) { echo $newGrade; } ?>
修改说明
- 删除了修改原文件
grades.txt的所有逻辑,避免原始数据被覆盖。 - 新增数组
$newGrades存储所有计算后的新成绩,后续写入文件和打印都使用该数组的数据,保证结果一致。 - 统一
raise()函数返回值格式,所有返回结果都携带换行符,保证文件写入格式正确,同时增加intval()+trim()处理读取到的成绩,避免隐式转换风险。 - 调整输出顺序,先完成新成绩的计算、文件写入,再统一打印输出,符合预期输出要求。
内容的提问来源于stack exchange,提问作者nsuspect
相关产品推荐
相关产品推荐

