C++读取文件时如何跳过空行?
解决C++读取文件时跳过空行的问题
你当前代码的问题主要有两点:
if(buffer == "\n")判断无效:getline函数读取行时,会自动丢弃末尾的换行符,不会把换行符存入buffer,所以这个条件永远不会成立,完全可以删除。- 未处理含空白字符的“空行”:如果你的文件里的“空行”实际包含空格、制表符这类空白字符,
buffer.empty()无法识别,导致这类行无法被跳过。
修改后的代码
#include <iostream> #include <fstream> #include <algorithm> #include <cctype> using namespace std; int main() { ifstream file_pointer; file_pointer.open("rules.txt", ios::in); if(!file_pointer.is_open()) { cout << "failed to read rule file." << endl; return 0; } string buffer; while(getline(file_pointer, buffer)) { // 跳过空行或仅含空白字符的行 if(buffer.empty() || all_of(buffer.begin(), buffer.end(), [](unsigned char c){ return isspace(c); })) { continue; } cout << buffer << endl; } file_pointer.close(); return 0; }
关键说明
- 使用
std::all_of结合std::isspace遍历行内所有字符,判断是否全为空白字符(空格、制表符、换行符等)。 - 用
unsigned char转换字符是为了避免std::isspace处理负数值(比如某些扩展ASCII字符)时出现未定义行为。
如果你不想使用C++11及以上的lambda表达式,也可以手动实现一个判断函数:
bool is_all_whitespace(const string& s) { for(char c : s) { if(!isspace(static_cast<unsigned char>(c))) { return false; } } return true; }
然后将循环内的判断改为:
if(buffer.empty() || is_all_whitespace(buffer))
内容的提问来源于stack exchange,提问作者Karmylr
相关产品推荐
相关产品推荐

