Обработка исключений для файлов - PullRequest
0 голосов
/ 30 марта 2011

Если программа пытается использовать мой класс чтения файлов для доступа к части файла, которая не существует (т. Е. Находится после ios_base :: end), какое исключение следует выдать?

Я собиралсяиспользовать std :: out_of_range, но теперь я начинаю думать, что std :: runtime_error будет более подходящим.

Edit:

Интерфейс работает немного по-другому, чем стандартный fstreamкласс в том, что он основан на for циклах, а не while циклах.Поэтому вместо того, чтобы делать следующее:

while (MyFile.peek() != EOF)
{
    char Character = MyFile.get();
    // Do stuff with Character.
}

Пользователь класса может сделать это:

for (std::streampos Pos = 0; Pos < MyFile.GetCharCount(); Pos++)
{
    char Character = MyFile.GetChar(Pos);
    // Do stuff with Character.
}

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

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

1 голос
/ 30 марта 2011

Если вы предоставляете массивоподобный интерфейс (используя operator [], скорее чем получить), то бросая std::out_of_range это хорошая идея; лучше Идея в этом случае может заключаться в том, чтобы выяснить, сколько байтов вы можете на самом деле получить доступ к функции size () и сделать ее доступной предварительное условие. (Конечно, чтобы обеспечить такой случайный доступ, вы все равно придется читать весь файл в память. Ты не можешь искать произвольные позиции случайным образом в текстовом файле, кроме Unix.)

Если вы предоставляете файл, подобный интерфейсу, то устанавливаете статус ошибки, как и iostream, является предпочтительным решением.

Если вы не предоставляете ни того, ни другого, все зависит от того, кто вы предоставление и каковы ожидания пользователя или должны быть.

1 голос
/ 30 марта 2011

Как они добираются до точки чтения после конца файла? Если они просто читают до конца файла, а затем продолжают читать, я бы просто дал сигнал EOF. Если они пытаются выйти за пределы конца файла, попытка поиска должна потерпеть неудачу, поэтому они никогда не дойдут до того, чтобы попытаться прочитать оттуда.

Однако я бы не подражал нормальным iostream слишком близко. В частности, когда / если чтение достигает конца файла, я бы не установил бит "залипания", который предотвращает дальнейшее чтение из файла до его очистки. Вполне разумно и нормально записывать файл в одном процессе и одновременно читать его в другом, поэтому достижение конца файла может быть временным условием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...