Какие виды входных потоков вы можете назвать seekg? - PullRequest
1 голос
/ 19 сентября 2011

У меня есть функция (прежняя версия), которая читает первые несколько строк файла, чтобы определить его тип, затем закрывает и снова открывает файл, чтобы он мог перечитать весь файл, используя правильный интерпретатор. Суть:

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();
}

1 Ответ

1 голос
/ 19 сентября 2011

Единственный реальный ответ, который можно дать, это то, что он работает там, где он работает. В в случае std::stringbuf он должен работать везде. В случае std::filebuf, работает ли он или нет, зависит от системы; будет обычно работает, если filebuf открыт для реального файла, но будет обычно терпит неудачу (возможно, молча, если система не сообщает об ошибке) для многих других типов ввода: с клавиатуры или именованного канала, для пример.

Более надежным решением было бы кеширование начального ввода и повторное чтение его из кеша.

...