You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:54:02