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; }
关键细节说明
- 标准输入的读取:
std::getline(std::cin, line)会持续读取直到遇到EOF(当管道里的所有内容都读完时,stdin就会触发EOF),完美适配管道的使用场景 - 空白行判断:
std::isspace能识别所有空白字符(空格、制表符、换行符等),覆盖了各种“看起来是空的”行情况 - 输出效率:用
'\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
相关产品推荐
相关产品推荐

