C++ ofstream写文件时每个单词自动换行如何解决
问题原因
单词单独换行的问题是两个写法共同导致的:
std::cin >> input的默认读取规则是以所有空白字符(空格、换行、制表符)为分隔符,每次调用只会读取一段连续的非空白内容,也就是单个单词,会自动跳过单词之间的空格和换行- 每次读取完单个单词后都主动追加了
\n换行符写入文件,最终就变成每个单词单独占一行的效果
修改方案
- 将逐单词读取的
std::cin >> input替换为std::getline(std::cin, input),该函数会一次性读取用户输入的一整行内容,完整保留行内的空格等格式,不会拆分单词 - 处理输入缓冲区的残留换行符:由于流操作会在缓冲区留存用户按回车产生的换行符,直接调用
getline可能第一次读到空内容,需要提前清空缓冲区到最近一个换行符为止 - 保留原有的整行写入后追加换行的逻辑即可,此时换行是加在每一行用户输入的末尾,不会拆分单词
- 注意使用缓冲区清空方法需要额外引入
<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
相关产品推荐
相关产品推荐

