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

C++ ofstream写文件时每个单词自动换行如何解决

问题原因

单词单独换行的问题是两个写法共同导致的:

  • std::cin >> input的默认读取规则是以所有空白字符(空格、换行、制表符)为分隔符,每次调用只会读取一段连续的非空白内容,也就是单个单词,会自动跳过单词之间的空格和换行
  • 每次读取完单个单词后都主动追加了\n换行符写入文件,最终就变成每个单词单独占一行的效果
修改方案
  1. 将逐单词读取的std::cin >> input替换为std::getline(std::cin, input),该函数会一次性读取用户输入的一整行内容,完整保留行内的空格等格式,不会拆分单词
  2. 处理输入缓冲区的残留换行符:由于流操作会在缓冲区留存用户按回车产生的换行符,直接调用getline可能第一次读到空内容,需要提前清空缓冲区到最近一个换行符为止
  3. 保留原有的整行写入后追加换行的逻辑即可,此时换行是加在每一行用户输入的末尾,不会拆分单词
  4. 注意使用缓冲区清空方法需要额外引入<limits>头文件
修改后完整代码
#include <limits> // 新增头文件用于缓冲区清空操作

void Log_Write::WriteInLog(std::string LogFileName)
{
    system("cls");
    std::string input;
    std::ofstream out;
    out.open(LogFileName, std::fstream::app);
    out << "\n\nNEW LOG ENTRY: " << getCurrentTime()<<"\n"; 
    // 清空输入缓冲区残留的换行符,避免首次getline读取空行
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    while (true)
    {
        system("cls");
        std::cout << "Writing in Log\n\nType 'x' to leave editor!\n\nInsert new entry: ";
        // 逐行读取整段用户输入,保留行内所有空格格式
        std::getline(std::cin, input);
        if (input == "x")
            break;
        // 整行内容写入完成后再追加换行,不会拆分单词
        out << input << "\n";
    }
    out.close();
}
效果说明

按照上述修改后:

  • 输入Test Input按回车,文件会写入整行Test Input后换行
  • 输入Next input按回车,文件会写入整行Next input后换行
  • 输入x按回车即可退出编辑,最终写入文件的内容和用户输入的原始格式完全一致,不会出现单词单独换行的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:03:26