如何使用重定向的标准输入读取文件,即 cin(注意:不使用 ifstream)

Posted

技术标签:

【中文标题】如何使用重定向的标准输入读取文件,即 cin(注意:不使用 ifstream)【英文标题】:How to read a file using the redirected standard input, i.e. cin(Note:without using ifstream) 【发布时间】:2017-01-07 09:12:12 【问题描述】:

另外:我通过在 VS2013 的属性页中编辑命令参数来重定向标准输入。我正在做一个小项目,它要求我在不使用 ifstream 的情况下读取文件,因为据说:您可以用于此分配的唯一库是 iostream、iomanip 和 string。

【问题讨论】:

std::cin >> istd::getline(std::cin) 等。看看istreams 可以做什么:en.cppreference.com/w/cpp/io/basic_istream 修改属性页并不是一种理想的方式 【参考方案1】:

您想将 cin 重定向到一个文件,为此您需要使用

设置与 cin 关联的流缓冲区

ios::rdbuf()

看看here

还有更多关于 SO here 和 here

【讨论】:

【参考方案2】:

当文件被重定向到 stdin(标准输入)时,您应该从标准输入的包装器 std::cinstd::istream 的实例)中读取。 std::basic_ifstreamstd::basic_istream 的子类,所以大部分阅读功能都在它们中可用,你应该熟悉它们。这意味着您可以使用:

std::getline逐行读取文件:

std::string s;
while(std::getline(std::cin, s)) 
    std::cout << s << std::endl;

operator &gt;&gt; 读取由空格字符分隔的字段:

while(std::cin) 
    std::string s;
    std::cin >> s;
    std::cout << s << std::endl;

在此处查看其运算符和函数的完整列表:http://en.cppreference.com/w/cpp/io/basic_istream

【讨论】:

是的,这就是我想要的答案!非常感谢你! ! ! 很难回答这个问题。问题是关于重定向不从 istreams 读取【参考方案3】:

您可以使用“freopen”功能。示例:

freopen("input.txt","r",stdin)。

这意味着您读取文件“input.txt”并将其内容保存到“stdin”。现在,你可以使用“cin”了。

【讨论】:

这不回答问题(freopen 不 read 文件)并使用 C 库(而问题被明确标记为 C++) 那么,如何在不打开文件的情况下使用 std::cin >> i, std::getline(std::cin) 从文件中读取数据? ./a.out &lt; file.txt 也就是所谓的文件输入重定向:sc.tamu.edu/help/general/unix/redirection.html 非常感谢。我以前从来不知道。

以上是关于如何使用重定向的标准输入读取文件,即 cin(注意:不使用 ifstream)的主要内容,如果未能解决你的问题,请参考以下文章

使用带有标准输入和标准输出重定向的 2 进程管道时如何避免标准输入上的重复输入

如何将标准输入重定向到 Windows 命令行中的文件?

shell中的重定向(输入输出)

标准输入输出文件重定向

使用 boost::process 读取 cout 并写入进程的 cin

重定向