C ++, как проверить, можно ли искать поток (iostream) - PullRequest
3 голосов
/ 26 февраля 2012

Есть ли способ проверить, можно ли искать поток потоков ostream?

Я подозреваю, что выполнение тестового поиска и проверки на сбой некорректно поскольку поиск может потерпеть неудачу по несвязанным причинам.

Мне нужно это для работы на Linux и Mac, если это имеет значение.

1 Ответ

5 голосов
/ 26 февраля 2012

Iostreams мало что дает. Потоковые объекты являются просто обертками вокруг буферного объекта, полученного из класса std::streambuf. (Предполагая «узкие» символы.) Стандартные производные классы буфера: std::stringbuf для строк и std::filebuf для файлов. Предположим, что вас интересуют только файлы, std::filebuf - это просто оболочка для функциональности библиотеки C. Библиотека C не определяет способ определения, поддерживает ли объект FILE поиск или нет, кроме попыток сделать это, так же как и C ++.

Для чего это стоит, семантика seek немного варьируется. Некоторые платформы могут позволять вам «искать» канал, но только в текущей позиции, чтобы определить, сколько символов было прочитано или записано. Поиск за концом может изменить размер файла или вызвать следующую операцию записи, чтобы изменить размер файла, или что-то среднее.

Вы также можете попробовать проверить errno, если установлен badbit (или, как я предпочитаю, использовать исключения вместо флагов).

...