我有一个函数(旧版),它读取文件的前几行以确定其类型,然后关闭并重新打开文件,以便它可以使用正确的解释器重新读取整个文件。要点是:
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
帮助。seekpos
seekoff
我想用新的(如下)重新实现原始功能,但我只是不知道这是否安全。
void readFile(const char *filename) {
ifstream is(filename);
readFile(is);
is.close();
}