You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++作业:实现管道接收文件并移除空行后保存的程序

C++实现从管道读取内容并移除空行

这个需求其实很好解决——管道传递给程序的是**标准输入(stdin)**的数据流,完全不需要关心原文件的名字,我们只需要做「读标准输入→过滤空行→写标准输出」这三件事就行,这样后续也能无缝把你的程序输出继续管道传给其他工具。

实现思路

  • 逐行读取标准输入:用C++的std::getline就能轻松搞定,它会自动处理每行的换行符
  • 过滤空行:这里要注意,通常我们说的「空行」不仅是完全没字符的行,还包括全是空格、制表符这类空白字符的行,所以需要写个小函数判断一行是否仅含空白
  • 输出有效行:把非空的行直接输出到标准输出,这样管道后面的程序就能接收到处理后的内容

完整代码示例

#include <iostream>
#include <string>
#include <cctype>

// 判断一行是否为空白行(空行或全是空白字符)
bool isBlankLine(const std::string& line) {
    for (char c : line) {
        // 转成unsigned char避免std::isspace处理负数值时的未定义行为
        if (!std::isspace(static_cast<unsigned char>(c))) {
            return false;
        }
    }
    return true;
}

int main() {
    std::string line;
    // 循环读取标准输入的每一行,直到输入结束(管道传完内容会触发EOF)
    while (std::getline(std::cin, line)) {
        // 只输出非空白行
        if (!isBlankLine(line)) {
            std::cout << line << '\n';
        }
    }
    return 0;
}

关键细节说明

  1. 标准输入的读取:std::getline(std::cin, line)会持续读取直到遇到EOF(当管道里的所有内容都读完时,stdin就会触发EOF),完美适配管道的使用场景
  2. 空白行判断:std::isspace能识别所有空白字符(空格、制表符、换行符等),覆盖了各种“看起来是空的”行情况
  3. 输出效率:用'\n'代替std::endl,因为std::endl会强制刷新输出缓冲区,频繁使用会拖慢处理速度,而'\n'只是输出换行,缓冲区会自动优化刷新时机,更适合处理大文件

编译与使用

  • 编译:用g或clang编译生成可执行文件
    g++ pg_rmv_empty_lines.cpp -o pg_rmv_empty_lines
    
  • 使用:直接通过管道传递输入,也可以结合重定向保存结果,或者继续管道给其他程序
    # 直接输出到终端
    inputfile.cpp | ./pg_rmv_empty_lines
    # 保存到新文件
    inputfile.cpp | ./pg_rmv_empty_lines > cleaned_file.cpp
    # 继续管道给其他程序处理
    inputfile.cpp | ./pg_rmv_empty_lines | your_next_program
    

内容的提问来源于stack exchange,提问作者Jonathan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:25:08