C++使用ofstream写入文件末尾出现多余空白字符问题求助
问题根因
- 流判断逻辑错误:
while (infile)和while (!infile.eof())都属于错误的流遍历写法。C++文件流的eof标记只有在尝试读取内容失败后才会被置位,无法提前预判是否还有下一行可读取。你的代码会在文件内容读完后多进入一次循环,此时getline读取失败拿到空字符串,你依然执行了写空格、写换行的逻辑,最终导致末尾出现多余空白和换行。 - 输出逻辑冗余:每个数值行输出后固定加空格,会导致每一行最后一个数值末尾多一个不必要的空格。
修复方案
你已经在第一遍遍历的时候统计出了准确的事件总数no_of_events,直接用这个数值控制循环即可,完全规避流判断的坑,同时调整输出逻辑避免行尾空格:
// 替换原有的第二个遍历写文件的全部代码 size_t processed_events = 0; // 用提前统计好的事件数控制循环,不会多执行 while (processed_events < no_of_events) { bool read_ok = true; // 读当前事件的头 for (unsigned int i = 0; i < header_no; i++) { if (!getline(infile, line)) { read_ok = false; break; } } if (!read_ok) break; // 读当前事件的数值点 for (unsigned int i = 0; i < points_no; i++) { if (!getline(infile, line)) { read_ok = false; break; } // 第一个数值不加前置空格,其余都加,避免行尾多余空格 if (i != 0) { outfile << " "; } outfile << line; } if (!read_ok) break; // 只有完整读完一个事件的所有内容才写换行 outfile << endl; processed_events++; }
如果不想用统计的事件数控制,也可以在每次读头之后判断流状态,但是用提前统计的数值更稳妥,不会因为文件结构异常多输出内容。
内容的提问来源于stack exchange,提问作者cZe99
相关产品推荐
相关产品推荐

