1

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

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

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

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

istream当实际是 astringstream或 an时,它似乎有效,fstream但我想知道我是否只是走运。我还对seekg-ing做了一个小测试std::cin,它奏效了,这让我感到惊讶。

所以我的问题是:你可以使用什么样的流seekg?什么时候会失败?规范参考会很棒——我浏览了一遍,上面的东西根本seekg没有pubseekpos帮助。seekposseekoff

我想用新的(如下)重新实现原始功能,但我只是不知道这是否安全。

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

1 回答 1

1

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

更健壮的解决方案是缓存初始输入,然后从缓存中重新读取。

于 2011-09-19T18:18:33.323 回答