猫文件名 |命令和命令<文件名的行为不同

cat filename | command and command < filename behaving differently

本文关键字:文件名 命令 lt      更新时间:2023-10-16
    #include <string>
    #include <iostream>
    int main() {
        std::string str;
        char magic[9];
        std::cin.read((char *)magic, sizeof(magic));
        std::cout << "eof/fail=" << std::cin.eof() << '/' << std::cin.fail() << 'n';
        std::cin.clear();
        std::cin.seekg(0, std::ios::beg);
        std::cout << "eof/fail=" << std::cin.eof() << '/' << std::cin.fail() << 'n';
        while (std::cin >> str) {
            std::cout << str << std::endl;
        }
    }

我的代码包含std :: cin

上的Seekg(0(fucntion的实现

表现不同当运行时 ./a.out < filenamecat filename | ./a.out

我正在考虑同等的方式。但是我很惊讶地看到他们的行为不同

我的问题是两种方式的主要区别是什么?它们不是获得标准输入的一种方法吗?

它们不是获得标准输入的一种方法吗?

是的,但是&hellip;

我正在考虑同等的方式。

它们非常不等。

cat filename | ./a.out

在这里,您的外壳运行了程序cat,告诉它与称为filename的文件的内容相呼应。它还运行程序a.out。它在它们之间打开"管道",并从一个人的标准输出流到对方的标准输入流。

./a.out < filename

在这里,您的外壳运行程序a.out,使文件filename通过该过程的标准输入流提供。这称为输入重定向


您可以围绕"文件"(更通常是块设备(寻找。如果从文件进行输入重定向,则您的外壳巧妙地告诉您的程序可以将流视为块设备,因此您可以享受寻求。

但是,使用管道,一旦您食用了数据,就消失了。你不能回到开始;这不是容器。这是数据流。