最可靠方法是用std::getline读空行并用line.empty()判断;混用>>和getline时需cin.ignore()清除残留换行符;Windows下可能残留'\r'需额外检查;循环读取应使用while(getline(fin,line))而非fin.eof()。

用 std::getline 读取空行最可靠
空行本质是只含换行符(\n 或 \r\n)的字符串,std::cin >> 会跳过所有空白(包括整个空行),根本读不到。必须用 std::getline —— 它按行切割,遇到换行符就停,不管前面有没有字符。
常见错误是混用 operator>> 和 getline:比如先用 cin >> n 读整数,再用 getline 读后续行,这时缓冲区残留的换行符会让第一个 getline 立刻返回空字符串,误判为空行。解决方法是读完非行输入后加 cin.ignore() 清掉换行符。
-
std::string line;+std::getline(std::cin, line)是标准做法 - 判断是否为空行:直接用
line.empty(),不要用line == ""(语义等价但不够惯用) - 如果文件以
\r\n结尾(Windows),getline会自动剥离\n,但保留\r—— 所以可能得到"\r"而非真正空串,需额外检查line == "\r"
从文件读空行要注意 std::ifstream 的打开模式
默认构造的 std::ifstream 以文本模式打开,换行处理和控制台一致;但若用二进制模式(std::ios::binary),getline 仍能读空行,只是不会自动转换 \r\n → \n,可能导致 line 含 \r。一般无需二进制模式读文本行。
- 打开文件:直接
std::ifstream fin("input.txt")即可 - 循环读取时,把
getline放在while条件里:while (std::getline(fin, line)) { ... },这样 EOF 和读取失败都能正确终止 - 别用
fin.eof()做循环条件——它只在尝试读失败后才置位,容易多循环一次
空行前后有空白字符?得自己清理
严格来说,“空行”常指视觉上为空,但实际可能含空格、制表符。如果业务要求忽略首尾空白后再判断是否为空,不能只靠 empty()。
立即学习“C++免费学习笔记(深入)”;
- 用
line.find_first_not_of(" \t\r\n")找第一个非空白位置,返回std::string::npos表示全空白 - 或用
std::all_of(line.begin(), line.end(), ::isspace)(注意包含<cctype>,且::isspace对char参数需转成unsigned char防 UB) - 若需兼容 Unicode 空白(如中文全角空格),C++ 标准库不直接支持,得用 ICU 或手动扩展字符集


















