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

Rust程序从STDIN读取输入时,如何判断输入已结束?

管道输入时程序自动终止读取的原理

这既不是cat发送了SIGINT信号,也不是靠空字节这类哨兵标记,核心是**EOF(文件结束符)**的流状态机制,具体流程如下:

  1. 管道的工作逻辑
    当你执行cat my_awesome_file | ./tiny_program时,cat会把文件内容全部输出到管道的写端,完成后cat会正常退出,同时关闭自己的标准输出(STDOUT)。此时管道的读端(你的程序的STDIN)会检测到输入流已经没有更多数据,触发EOF状态。

  2. Rust代码的处理逻辑
    你的代码里std::io::stdin().lines()返回的是一个迭代器,它会持续尝试从STDIN读取行数据:

  • 每次迭代调用next()时,会读取一行直到换行符;
  • 当底层输入流触发EOF状态时,迭代器会返回None,for循环因此自动终止,程序继续执行后续的打印链表操作。

常见误解澄清

  • 不是SIGINT信号:SIGINT是强制中断信号(比如手动按Ctrl+C),cat正常完成文件读取后会优雅退出,不会发送该信号。
  • 不是空字节哨兵:空字节是普通的二进制数据,不会被当作输入结束的标记,EOF是流的状态,而非实际存在的字节。

附上你的测试代码:

use std::collections::LinkedList;

fn main() {
    let mut ll: LinkedList<String> = LinkedList::new();
    for line in std::io::stdin().lines() {
        ll.push_back(line.unwrap());
    }
    println!("{:?}", ll);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 02:00:11