你可以调用什么类型的输入流?

时间:2011-09-19 17:44:42

标签: c++ stream iostream seekg

我有一个函数(遗留),它读取文件的前几行以确定其类型,然后关闭并重新打开文件,以便它可以使用正确的解释器重新读取整个文件。要点是:

void readFile(const char *filename) {
  ifstream is(filename);
  Filetype ft = determineFileType(is);
  is.close();
  is.open(filename);
  parseFile(is, ft);
}

我需要一个类似的功能,可以在已经打开的流上运行。我创建了一个新函数,它使用ostream &而不是char *filename - 基本上就是这样:

void readFile(istream &is) {
  std::ios::streampos pos = is.tellg();
  Filetype ft = determineFileType(is);
  is.seekg(pos);
  parseFile(is, ft);
}

istream实际上是stringstreamfstream时似乎有效,但我想知道我是否真的很幸运。我还对seekg - std::cin进行了一次小测试,结果令我感到惊讶。

所以我的问题:您允许使用seekg哪种类型的流?什么时候会失败?规范引用会很棒 - 我查看了seekgpubseekposseekposseekoff上的内容根本没用。

我想重新实现新功能(如下所示),但我不知道这是否安全。

void readFile(const char *filename) {
  ifstream is(filename);
  readFile(is);
  is.close();
}

1 个答案:

答案 0 :(得分:1)

唯一可以给出的真正答案是它在有效的地方起作用。在 在std::stringbuf的情况下,它应该适用于所有地方。如果是 std::filebuf,是否有效取决于系统;它会 如果在实际文件上打开filebuf,通常会工作,但是会 通常失败(如果系统没有报告错误,可能是默默地) 对于许多其他类型的输入:来自键盘或命名管道,用于 例。

更强大的解决方案是缓存初始输入,并从缓存中重新读取它。