powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / проверки ошибок потоков ввода-вывода
12 сообщений из 12, страница 1 из 1
проверки ошибок потоков ввода-вывода
    #38823026
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть вот такой код

std::ifstream t("file.txt");
std::string str((std::istreambuf_iterator<char>(t)),
std::istreambuf_iterator<char>());

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

Вопрос: как в таком случае лучше всего проверять ошибки ввода-вывода? Речь не идёт о ситуации порождения исключения. Вполне возможна ситуация, когда скачался кусок файла из-за недостаточной производительности подсистемы ввода-вывода (для усиления - пусть это будет дискета). В "обычной ситуации" "недосчитывание" можно посмостреть чере fail-bit. Кто как поступает?
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38823195
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
fp=fopen();
while(! feof(fp) ) {
   fread( fp, .... );
}
fclose();


И никаких проблем.
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38823246
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем :) Это скорее сишный код. Точно не STL :)
И отлов ошибок (прочитал меньше, чем должен был) просто переносится в цикл - на вызов fread :))
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38823262
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38823350
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaВопрос: как в таком случае лучше всего проверять ошибки ввода-вывода? Речь не идёт о ситуации порождения исключения. Вполне возможна ситуация, когда скачался кусок файла из-за недостаточной производительности подсистемы ввода-вывода (для усиления - пусть это будет дискета). В "обычной ситуации" "недосчитывание" можно посмостреть чере fail-bit. Кто как поступает?

А кто мешает проверить этот fail-bit в этом коде после операции ?
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38824218
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
да ни кто в общем-то не мешает. Что-то вроде
t.fail()

Просто при чтении "по привычке" в С-стиле посимвольно всегда можно повторить чтение (в одном и том же цикле). А здесь придётся как-то дочитывать и делать append(). Вот и интересно, кто как заморачивается, если заморачивается.
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38824249
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga,

я не понимаю, что там можно проверять и что дочитывать, если эта конструкция читает весь файл в строку.
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38824316
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
эта конструкция должна читать весь файл в строку, но не гарантирует этого.

Приведу простой (невыдуманный) пример:

Требовалось распарсить ней достаточно большой файл. Читался он в С-стиле с помощью fopen-fclose-fread посимвольно. Проблема была в том, что в таком стиле он парсился достаточно долго. Для ускорения этого процесса сначала стали заводить локальный буфер, в который читался сразу блок, а затем анализ проводился посимвольно (с подкачкой данных в буфер, если финальный токен не оказывался в буфере). Но поддерживать буфер самому посчитали некомильфо, тем более, в потоки ввода-вывода уже встроена буферизация. Решили попробовать "буферизацию от профи", и делали "в лоб" типа while(cin >> ch){}. Такой подход принёс неожиданный сюрприз: хоть "всё и ускорилось", часть файлов, находившихся на NFS или при интенсивной I/O, новой версией парситься перестало. Получалось: когда обработка опустошала буфер cin, если до следующего чтения из cin он не успевал "пополниться", происходил выход из цикла (с флагом cin.fail() ). В результате решили читать не посимвольно, а в string (кусками, чтобы не пытаться запихнуть в память несколько гигов). Опустошить буфер при этом стало проблематично ( мы сделали это в нескольких специальных случаях :), но и на эту "экзотику" ввели проверку и несколько попыток на "дочитывание" (и последующее str.append(rest)). В результате получили 1. выигрыш по скорости по сравнению с небуферизированным чтением 2. уход от ручного управления буферами. По скорости, что интересно, получилось чуть медленнее чистого С с "ручным" буфером.

ЗЫ
Понятно, что можно было написать свой класс, который прятал бы исходный С-буфер и процесс его подкачки. Но решение cin + string оказалось достаточно простым и прозрачным.

ЗЗЫ
Синхронизацию потоков с stdin и stdout отключили сразу, так что из-за этого тормозить не может
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38824382
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga,

Вот что религия с людьми делает.
Нормальный человек возьмет и сделает задачу на том, на чем удобно.
А фанатик stl'я будет упрямо ковырять stl.
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38824407
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaНо поддерживать буфер самому посчитали некомильфо
отображение в память средствами ОС не пробовали?
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38824489
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВот что религия с людьми делает.
Нормальный человек возьмет и сделает задачу на том, на чем удобно.
А фанатик stl'я будет упрямо ковырять stl.

Да при чём тут религия? Было старое решение, которое перестало устраивать. Добавили буфер - оказалось, быстро, но неудобно (усложнилась логика работы и стали вылезать косяки по работе с ним у некоторых более неопытных товарищей). Переделали на потоки. Стало просто и квадратно. Можно было, конечно, написать класс-обёртку над "старыми буферами" (чтобы прятать подкачку и буферизацию). Можно такую же обёртку над потоками (чтобы спрятать "дочитывание" при опустошении, но это всего строчка-другая кода). Но зачем, если и так работает? (у них вроде и сейчас так работает)
...
Рейтинг: 0 / 0
проверки ошибок потоков ввода-вывода
    #38824491
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TBagaBagaНо поддерживать буфер самому посчитали некомильфо
отображение в память средствами ОС не пробовали?

Нет, не пробовали. Тогда нужна была кроссплатформенность (как минимум - на клиенте винда, на сервере - FreeBSD, тогда вроде бы ещё 4.4).
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / проверки ошибок потоков ввода-вывода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]