#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 < filename和cat filename | ./a.out身份运行时,它的行为有所不同
我在考虑这两种方式的等价性。但令我惊讶的是,他们的行为却不同
我的问题是,这两种方式的主要区别是什么?它们不都是获取标准输入的一种方式吗?
发布于 2018-02-27 01:58:30
不都是获取标准输入的一种方式吗?
是的,但是…
我在考虑这两种方法的等价性。
它们非常不等价。
cat filename | ./a.out在这里,外壳程序运行程序cat,告诉它回显一个名为filename的文件的内容。它还运行程序a.out。它打开了它们之间的“管道”,并将信息从一个人的标准输出流传输到另一个人的标准输入流。
./a.out < filename在这里,您的外壳程序运行程序a.out,通过进程的标准输入流提供文件filename。这称为输入重定向。
您可以在“文件”(更一般地,块设备)中查找。在从文件输入重定向的情况下,您的shell巧妙地告诉您的程序,它可以将流视为块设备,因此您可以享受寻求性。
但是,有了烟斗,once you've consumed your data, that's it it's gone。你不能回到开始;它不是一个容器。这是一个数据流。
https://stackoverflow.com/questions/48994115
复制相似问题