C++读写文本文件出现重复读取 多余换行导致内容重复如何解决
问题根源
文件写入时每次输出末尾的std::endl会插入换行符,最终文件末尾会多出一个换行符,按\n分割内容时,换行符后的空内容会被识别为最后一行,这行无效数据就是你异常读取结果的诱因。
解决方案
方案1:读取端直接跳过空行(适配你当前的范围for写法,改动最小)
在遍历lines的循环开头增加空行判断,遇到空行直接跳过即可,同时建议增加字段合法性校验,避免分割后字段不足导致下标越界崩溃。
修改后的循环代码如下:
for (auto ad_text: lines) { // 跳过空行,若需要跳过全空白行可增加trim逻辑后再判空 if (ad_text.empty()) { continue; } auto ad_parts = splitString(ad_text, "|"); // 校验字段数量是否符合要求,避免异常数据导致崩溃 if (ad_parts.size() < 3) { continue; } string string1 = ad_parts[0]; string string2 = ad_parts[1]; string string3 = ad_parts[2]; auto new_class = MyClass(string1, string2, string3); add_class(new_class); }
方案2:从写入端优化,从根源避免多余空行(推荐)
你原本的写入逻辑存在频繁开关文件的性能问题,可先优化文件打开关闭的逻辑,同时可调整换行符的写入逻辑,避免末尾多出空行。
优化后的写入代码如下:
void my_class::save_file(const char* text) { std::ofstream outputFile(text, std::ios::app); if (!outputFile.is_open()) { return; } for (size_t i = 0; i < ad_list.size(); i++) { const auto& ad = ad_list[i]; outputFile << ad.string1 << "|" << ad.string2 << "|" << ad.string3 << "|"; // 仅非最后一行加换行符,避免末尾多余空行 if (i != ad_list.size() - 1) { outputFile << std::endl; } } outputFile.close(); }
如果不需要严格避免末尾换行,只做文件打开逻辑的优化即可,配合读取端的空行判断也能解决问题。
内容的提问来源于stack exchange,提问作者Arman Iqbal
相关产品推荐
相关产品推荐

