首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++ streams的freopen()等效项

c++ streams的freopen()等效项
EN

Stack Overflow用户
提问于 2011-03-10 17:11:30
回答 3查看 29.4K关注 0票数 21

当使用c风格的i/o编程时,我有时会使用freopen()重新打开stdin进行测试,这样我就不必一次又一次地重新输入输入。我想知道是否有用于c++ i/o流的等价物。此外,我知道我可以使用管道在命令行/终端/其他地方重定向它,但我想知道是否有一种方法可以在我的代码中做到这一点(因为正如你所看到的,我对cl/t/w不是很了解)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-10 17:26:47

freopen还可以与cincout一起使用。不需要搜索新的东西。

代码语言:javascript
运行
复制
freopen("input.txt", "r", stdin); // redirects standard input
freopen("output.txt", "w", stdout); // redirects standard output

int x;
cin >> x; // reads from input.txt
cout << x << endl; // writes to output.txt

编辑:来自C++标准27.3.1的

对象cin控制来自与<cstdio>中声明的对象stdin相关联的流缓冲器的输入。

所以根据标准,如果我们重定向stdin,它也会重定向cin。对于cout,反之亦然。

票数 40
EN

Stack Overflow用户

发布于 2011-03-12 05:29:42

代码语言:javascript
运行
复制
#include <iostream>
#include <fstream>

int main() {

  // Read one line from stdin
  std::string line;
  std::getline(std::cin, line);
  std::cout << line << "\n";

  // Read a line from /etc/issue
  std::ifstream issue("/etc/issue");
  std::streambuf* issue_buf = issue.rdbuf();
  std::streambuf* cin_buf = std::cin.rdbuf(issue_buf);
  std::getline(std::cin, line);
  std::cout << line << "\n";

  // Restore sanity and read a line from stdin
  std::cin.rdbuf(cin_buf);
  std::getline(std::cin, line);
  std::cout << line << "\n";
}

http://www.cplusplus.com/reference/iostream/ios/rdbuf/

票数 14
EN

Stack Overflow用户

发布于 2011-03-10 18:57:18

This新闻组帖子探索您的选择。

这是系统相关的,海报没有指明系统,但cin.clear()应该可以工作。我已经在装有AT&T版本iostreams的UNIX系统上测试了附加的程序。

代码语言:javascript
运行
复制
#include <iostream.h>
int main()
{
    for(;;) {
        if ( cin.eof() ) {
            cout << "EOF" << endl;
            cin.clear();
        }
        char c ;
        if ( cin.get(c) ) cout.put(c) ;
    }
} 

是的,它在cfront和TC++中工作得很好。在最先出现问题的g++中,需要执行额外的操作:

代码语言:javascript
运行
复制
  cin.clear();
  rewind ( _iob ); // Seems quite out of place, doesn't it?
                   // cfront also accepts but doesn't
                   // require this rewind. 

虽然我注意到这是在1991年,但它应该仍然有效。记住使用现在标准的iostream标头,而不是iostream.h

(顺便说一句,我发现这篇帖子的谷歌搜索词是"reopen cin c++",第二个结果。)

让我们知道你的进展如何。你也可以直接使用freopen

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

https://stackoverflow.com/questions/5257509

复制
相关文章

相似问题

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