Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
Есть вот такой код std::ifstream t("file.txt"); std::string str((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>()); который приводится в книгах в том числе и классиков, и который должен считывать весь файл в строку полностью. Вопрос: как в таком случае лучше всего проверять ошибки ввода-вывода? Речь не идёт о ситуации порождения исключения. Вполне возможна ситуация, когда скачался кусок файла из-за недостаточной производительности подсистемы ввода-вывода (для усиления - пусть это будет дискета). В "обычной ситуации" "недосчитывание" можно посмостреть чере fail-bit. Кто как поступает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2014, 21:20 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. И никаких проблем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 08:02 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
Не совсем :) Это скорее сишный код. Точно не STL :) И отлов ошибок (прочитал меньше, чем должен был) просто переносится в цикл - на вызов fread :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 09:38 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 09:54 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
BagaBagaВопрос: как в таком случае лучше всего проверять ошибки ввода-вывода? Речь не идёт о ситуации порождения исключения. Вполне возможна ситуация, когда скачался кусок файла из-за недостаточной производительности подсистемы ввода-вывода (для усиления - пусть это будет дискета). В "обычной ситуации" "недосчитывание" можно посмостреть чере fail-bit. Кто как поступает? А кто мешает проверить этот fail-bit в этом коде после операции ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 11:03 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
MasterZiv, да ни кто в общем-то не мешает. Что-то вроде t.fail() Просто при чтении "по привычке" в С-стиле посимвольно всегда можно повторить чтение (в одном и том же цикле). А здесь придётся как-то дочитывать и делать append(). Вот и интересно, кто как заморачивается, если заморачивается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 22:14 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
BagaBaga, я не понимаю, что там можно проверять и что дочитывать, если эта конструкция читает весь файл в строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.12.2014, 23:05 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
MasterZiv, эта конструкция должна читать весь файл в строку, но не гарантирует этого. Приведу простой (невыдуманный) пример: Требовалось распарсить ней достаточно большой файл. Читался он в С-стиле с помощью fopen-fclose-fread посимвольно. Проблема была в том, что в таком стиле он парсился достаточно долго. Для ускорения этого процесса сначала стали заводить локальный буфер, в который читался сразу блок, а затем анализ проводился посимвольно (с подкачкой данных в буфер, если финальный токен не оказывался в буфере). Но поддерживать буфер самому посчитали некомильфо, тем более, в потоки ввода-вывода уже встроена буферизация. Решили попробовать "буферизацию от профи", и делали "в лоб" типа while(cin >> ch){}. Такой подход принёс неожиданный сюрприз: хоть "всё и ускорилось", часть файлов, находившихся на NFS или при интенсивной I/O, новой версией парситься перестало. Получалось: когда обработка опустошала буфер cin, если до следующего чтения из cin он не успевал "пополниться", происходил выход из цикла (с флагом cin.fail() ). В результате решили читать не посимвольно, а в string (кусками, чтобы не пытаться запихнуть в память несколько гигов). Опустошить буфер при этом стало проблематично ( мы сделали это в нескольких специальных случаях :), но и на эту "экзотику" ввели проверку и несколько попыток на "дочитывание" (и последующее str.append(rest)). В результате получили 1. выигрыш по скорости по сравнению с небуферизированным чтением 2. уход от ручного управления буферами. По скорости, что интересно, получилось чуть медленнее чистого С с "ручным" буфером. ЗЫ Понятно, что можно было написать свой класс, который прятал бы исходный С-буфер и процесс его подкачки. Но решение cin + string оказалось достаточно простым и прозрачным. ЗЗЫ Синхронизацию потоков с stdin и stdout отключили сразу, так что из-за этого тормозить не может ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 00:34 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
BagaBaga, Вот что религия с людьми делает. Нормальный человек возьмет и сделает задачу на том, на чем удобно. А фанатик stl'я будет упрямо ковырять stl. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 04:17 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
BagaBagaНо поддерживать буфер самому посчитали некомильфо отображение в память средствами ОС не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 06:27 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
White OwlВот что религия с людьми делает. Нормальный человек возьмет и сделает задачу на том, на чем удобно. А фанатик stl'я будет упрямо ковырять stl. Да при чём тут религия? Было старое решение, которое перестало устраивать. Добавили буфер - оказалось, быстро, но неудобно (усложнилась логика работы и стали вылезать косяки по работе с ним у некоторых более неопытных товарищей). Переделали на потоки. Стало просто и квадратно. Можно было, конечно, написать класс-обёртку над "старыми буферами" (чтобы прятать подкачку и буферизацию). Можно такую же обёртку над потоками (чтобы спрятать "дочитывание" при опустошении, но это всего строчка-другая кода). Но зачем, если и так работает? (у них вроде и сейчас так работает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 09:36 |
|
||
|
проверки ошибок потоков ввода-вывода
|
|||
|---|---|---|---|
|
#18+
Dima TBagaBagaНо поддерживать буфер самому посчитали некомильфо отображение в память средствами ОС не пробовали? Нет, не пробовали. Тогда нужна была кроссплатформенность (как минимум - на клиенте винда, на сервере - FreeBSD, тогда вроде бы ещё 4.4). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2014, 09:39 |
|
||
|
|

start [/forum/search_topic.php?author=JavixOne&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
58ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 908ms |
| total: | 1074ms |

| 0 / 0 |
