C++ cat文件名|命令和命令
我的代码包含seekg0功能在std::cin上的实现 它的行为有所不同 当运行为 ./a.out<文件名 和 cat文件名|/a.out 我认为这两种方法都是等效的。 但我惊讶地发现他们的行为有所不同 我的问题是,这两方面的主要区别是什么? 它们都是获取标准输入的一种方式吗 它们都是获取标准输入的一种方式吗 是的,但是 我认为这两种方法都是等效的 它们在很大程度上是不同的C++ cat文件名|命令和命令,c++,inputstream,stdin,C++,Inputstream,Stdin,我的代码包含seekg0功能在std::cin上的实现 它的行为有所不同 当运行为 ./a.out
#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;
}
}
在这里,shell运行程序cat,告诉它回显名为filename的文件的内容。它还运行程序a。它打开了它们之间的管道,将信息从一个标准输出流传输到另一个标准输入流
cat filename | ./a.out
在这里,shell运行程序a.out,使文件名通过进程的标准输入流可用。这称为输入重定向
你可以在一个文件周围搜索,更一般的是,阻塞设备。在从文件进行输入重定向的情况下,shell巧妙地告诉程序它可以将流视为块设备,因此您可以享受seekness
但是,用烟斗。你不能回到开始;它不是一个容器。这是一个数据流。你不能在管道中寻找,它只是一个方向。它们的行为有什么不同?问题是什么?是的,他们的行为不同。有问题吗?我的问题是这两种方法之间的基本区别是什么如果你想得到比我在下面发布的内容更广泛的解释,你首先必须证明你已经研究了终端、外壳和管道如何工作的基本理解。
./a.out < filename