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变量,导致循环逻辑异常,虽不直接引发换行,但会影响后续内容生成。
修复方案
- 清理文本首尾空白:读取行后添加
.trim(),去除所有首尾空白(包括换行符、空格),分割字段时也同步清理:
let s = fs.readFileSync('towns.txt', 'utf-8').split('\n')[l].trim(); let [a, b] = s.split('-').map(item => item.trim());
- 修正循环变量:将内层循环的条件变量替换为对应循环的变量名:
// 修复第一个内层循环 for(let ii=0; ii < Math.floor(Math.random() *4) + 5; ii++) { // 原代码逻辑不变 } // 修复第二个内层循环 for (let iii=0; iii < campaign.length; iii++) { // 原代码逻辑不变 }
经过以上修改,生成的文本末尾**会和主体内容保持在同一行。
内容的提问来源于stack exchange,提问作者ZedBear
相关产品推荐
相关产品推荐

