У меня есть функция (прежняя версия), которая читает первые несколько строк файла, чтобы определить его тип, затем закрывает и снова открывает файл, чтобы он мог перечитать весь файл, используя правильный интерпретатор. Суть:
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
на самом деле stringstream
или fstream
, но мне интересно, повезло ли мне. Я также провел небольшой тест на seekg
-ing std::cin
, и он сработал, что меня удивило.
Итак, мой вопрос : какие потоки вы можете использовать для seekg
? Когда это не удастся? Ссылки на спецификации были бы хороши - я просмотрел, и вещи на seekg
, pubseekpos
, seekpos
, seekoff
не помогли вообще.
Я хотел бы переопределить исходную функцию в терминах новой (как показано ниже), но я просто не знаю, безопасно ли это.
void readFile(const char *filename) {
ifstream is(filename);
readFile(is);
is.close();
}