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

Node.js fs模块写入文件时末尾为何自动换行?

问题:生成文本时末尾星号被换行到新行

我编写了一段Node.js代码,从文件提取内容生成文本并写入output.txt,但未设置换行的情况下,末尾的两个星号却被换到了新行。

代码示例

const fs = require('fs');
const readline = require('readline');

let l = Math.floor(Math.random() * 140);

let s = fs.readFileSync('towns.txt', 'utf-8').split('\n')[l]
let [a, b] = s.split('-')

b = b.toUpperCase();

/* require('dotenv').config()
const { Client, Discord, GatewayIntentBits } = require('discord.js');
const { Console } = require('console');
const client = new Client({
    intents: 3661
});

client.login(process.env.BOT_TOKEN)

client.on("ready", () => {
    // Code goes here
    console.log("Bot is ready!")
})

client.on("message", msg => {
    if (msg.content === "!campaign") {
        console.log("found msg")
        msg.reply(":LNP_Logo: Campaigns in " + a + ", " + b + "")
        msg.react("✅")
    }
    })
  */  
for(let i=0; i < 1; i++) {
    var campaignOut = fs.createWriteStream('output.txt', {
        flags: 'a'
    })

    let l = Math.floor(Math.random() * 140);

    let s = fs.readFileSync('towns.txt', 'utf-8').split('\n')[l]
    let [a, b] = s.split('-')

    const campaign = [];

    for(let ii=0; i < Math.floor(Math.random() *4) + 5; i++) {
        let c = Math.floor(Math.random() *28);
        let c2 = fs.readFileSync('campaigns.txt', 'utf-8').split('\n')[c]

        campaign.push(c2)
    }

    campaignOut.write(":LNP_Logo: **Campaigns in " + a + ", " + b.toUpperCase() + "**" + "\n" + "");
    for (let iii=0; i < campaign.length; i++) {
        campaignOut.write("\n" + campaign[iii] + "\n");
    }
}

输出异常

:LNP_Logo: **Campaigns in Wodonga, HUME
**

可见末尾的**被强制换到了新行。


问题根源

  • 隐藏换行符残留:towns.txt中的行可能包含Windows风格的\r\n换行符,用split('\n')分割后,行内容末尾会残留\r字符。拼接时这个隐藏字符会触发换行,把**挤到下一行。
  • 循环变量误用:内层循环错误使用了外层的i变量,导致循环逻辑异常,虽不直接引发换行,但会影响后续内容生成。

修复方案

  1. 清理文本首尾空白:读取行后添加.trim(),去除所有首尾空白(包括换行符、空格),分割字段时也同步清理:
let s = fs.readFileSync('towns.txt', 'utf-8').split('\n')[l].trim();
let [a, b] = s.split('-').map(item => item.trim());
  1. 修正循环变量:将内层循环的条件变量替换为对应循环的变量名:
// 修复第一个内层循环
for(let ii=0; ii < Math.floor(Math.random() *4) + 5; ii++) {
    // 原代码逻辑不变
}

// 修复第二个内层循环
for (let iii=0; iii < campaign.length; iii++) {
    // 原代码逻辑不变
}

经过以上修改,生成的文本末尾**会和主体内容保持在同一行。


内容的提问来源于stack exchange,提问作者ZedBear

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:10:31