首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cat filename |命令和命令< filename行为不同

cat filename |命令和命令< filename行为不同
EN

Stack Overflow用户
提问于 2018-02-27 01:41:38
回答 1查看 34关注 0票数 0
代码语言:javascript
复制
    #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)函数的实现

在以./a.out < filenamecat filename | ./a.out身份运行时,它的行为有所不同

我在考虑这两种方式的等价性。但令我惊讶的是,他们的行为却不同

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

EN

回答 1

Stack Overflow用户

发布于 2018-02-27 01:58:30

不都是获取标准输入的一种方式吗?

是的,但是…

我在考虑这两种方法的等价性。

它们非常不等价。

代码语言:javascript
复制
cat filename | ./a.out

在这里,外壳程序运行程序cat,告诉它回显一个名为filename的文件的内容。它还运行程序a.out。它打开了它们之间的“管道”,并将信息从一个人的标准输出流传输到另一个人的标准输入流。

代码语言:javascript
复制
./a.out < filename

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

您可以在“文件”(更一般地,块设备)中查找。在从文件输入重定向的情况下,您的shell巧妙地告诉您的程序,它可以将流视为块设备,因此您可以享受寻求性。

但是,有了烟斗,once you've consumed your data, that's it it's gone。你不能回到开始;它不是一个容器。这是一个数据流。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48994115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档