169 похожих чатов

Можно ли как-то в bytestring установить позицию, с которой надо

читать значения? (аналог fseek)

41 ответов

12 просмотров

но это же не связанные вещи. bytestring ниоткуда не читает. может быть, у вас ленивый IO, читающий из файла?

Cheese Syrowiecki
но это же не связанные вещи. bytestring ниоткуда н...

bytestring - это упрощённо набор байт. есть же ещё lazy bytestring. и я так написал, потому что не знаю, как они работают. я подумал, что с помощью lazy bytestring можно абстрагироваться от файловой системы (хотя зачем? может, при передаче данных по сети можно более эффективно обрабатывать эти данные, однако ведь данные всё равно будут передаваться последовательно (т.е. не получится сделать fseek)) проблема в том, что файл может быть большим, но его не надо весь грузить в память, а только по мере надобности (честно, у меня плохое представление по этом всем вещам, поэтому могу писать какую-то фигню)

Воинствующий Безбожник
bytestring - это упрощённо набор байт. есть же ещё...

Lazy.ByteString — это очень простой и местами вредный способ абстрагироваться от входящего потока байт. про файловую систему он ничего не знает. но вы можете открыть файл, сделать fseek по нему, а потом с нужного места читать, через Lazy I/O или другим способом

Воинствующий Безбожник
bytestring - это упрощённо набор байт. есть же ещё...

может, лучше получить представление о лени, а потом прикладывать её к файлам?

Cheese Syrowiecki
может, лучше получить представление о лени, а пото...

да. получается, я хочу применить то, чего не понимаю. итог будет очевиден

кана
а можно пример вредности?

когда файл на носителе меняется в процессе чтения

Cheese Syrowiecki
Lazy.ByteString — это очень простой и местами вред...

1. System.IO.withBinaryFile "file" ReadMode 2. System.IO.hSeek 3. Data.ByteString.Lazy.hGet, hGetContents

Cheese Syrowiecki
1. System.IO.withBinaryFile "file" ReadMode 2. Sys...

а на маленьких файлах может быть такое, что лучше будет загружать весь файл полностью? тогда придётся иметь две реализации (правда, придётся получать срез, что довольно неэффективно)

Воинствующий Безбожник
а на маленьких файлах может быть такое, что лучше ...

а в чём проблема? маленькие файлы тоже можно читать по частям

Cheese Syrowiecki
а в чём проблема? маленькие файлы тоже можно читат...

можно, да, но может лучше из маленького файла читать данные сразу?

Cheese Syrowiecki
почему?

будет более эффективно (предположение, обоснованное тем, что данные будут уже в памяти и не придётся лишний раз обращаться к диску)

Воинствующий Безбожник
можно, да, но может лучше из маленького файла чита...

BSL.getContents читает блоками. если файл маленький и полностью помещается в блок, то будет прочитан за раз

Cheese Syrowiecki
1. System.IO.withBinaryFile "file" ReadMode 2. Sys...

получается, чтобы считывать с файла и считывать со строки мне придётся иметь две реализации? (я занимаюсь разбором MS CFB (FAT в файле), в котором нужно делать fseek, чтобы перемещаться по секторам)

Воинствующий Безбожник
получается, чтобы считывать с файла и считывать со...

перемещайтесь по секторам (hSeek) и читайте файл (hGet). нет никаких проблем

Cheese Syrowiecki
что такое "считывать со строки"?

строка в данном случае ByteString. На входе целая строка, а не файл

Cheese Syrowiecki
а на выходе что?

на выходе возможность обратиться к какому-нибудь сектору (или цепочке секторов, но не суть. одно и то же)

Воинствующий Безбожник
на выходе возможность обратиться к какому-нибудь с...

что такое обратиться? прочитать строку? из строки строку не надо читать, она уже строка

Cheese Syrowiecki
что такое обратиться? прочитать строку? из строки ...

дело в том, что в файлах формата MS CFB есть собственная, можно сказать, файловая система (с директориями и файлами). файловая система в файле, в общем. чтобы прочитать файл (в этой ФС), нужно сначала загрузить таблицу FAT-секторов (цепочку секторов, т.е. какой сектор следует за каким), далее понять, какой сектор является начальным для файла в этой ФС, а потом последовательно прочитать сектора, соединив все части. в общем, изначально нет смысла читать все сектора (и с файлами всё понятно, можно использовать, как вы писали выше, hSeek & hGet) со строкой я попробовал использовать splitAt, но он в память загружается вся строка (ведь результат — кортеж с началом и хвостом), но это в любом случае неизбежно

Воинствующий Безбожник
дело в том, что в файлах формата MS CFB есть собст...

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

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

да, это так. дело в том, что я думаю над тем, можно ли не писать две реализации для строки и для файла. ведь отличается лишь метод получения секторов, но так как функция используется везде, то придётся писать две реализации не только этой функции, что очень плохо

Воинствующий Безбожник
да, это так. дело в том, что я думаю над тем, можн...

можно написать один интерфейс произвольного доступа с двумя реализациями. только у сетевого потока нет произвольного доступа

Cheese Syrowiecki
можно написать один интерфейс произвольного доступ...

нормальной ли практикой будет засунуть эту функцию в ReaderT?

Cheese Syrowiecki
можно написать один интерфейс произвольного доступ...

у меня получилось что-то такое: class SectorGetter a where getSector :: a -> Integer -> Integer -> BL.ByteString однако, я понял, что если a = ByteString, то всё хорошо, но если a = Handle, то придётся возвращать IO ByteString, что не соответствует сигнатуре. может, тогда не пытаться писать единый интерфейс, а всё-таки написать две реализации (пусть, они и будут почти идентичны)?

Воинствующий Безбожник
у меня получилось что-то такое: class SectorGetter...

да, DRY не закон. можно сначала покопировать, а потом обобщить, если будет нужда

Cheese Syrowiecki
да, DRY не закон. можно сначала покопировать, а по...

всё же я смог обобщить, но похоже на какую-то фигню. и далее можно использовать (извините за скрины. если так нельзя, то ок. да вообще, наверное, вопросы такие глупые не стоит задавать, но дело в том, что годных мануалов по парсингу я не нашёл. ну либо я просто не хочу разбираться, поэтому задаю вопросы)

Воинствующий Безбожник
screenshot

вроде норм. почему фигня? что не нравится?

Воинствующий Безбожник
screenshot

я бы здесь убрал Identity, оставив чистую функцию, а в конфиге её можно завернуть в pure

Cheese Syrowiecki
да, DRY не закон. можно сначала покопировать, а по...

DRY-driven development не закон. Покопировать и обобщить — это как раз DRY.

Alexey Fedotov
DRY-driven development не закон. Покопировать и об...

не обязательно любые повторы обобщать, только те, которые жмут и выражают общую абстракцию

Cheese Syrowiecki
вроде норм. почему фигня? что не нравится?

не нравится, что надо писать ненужные runGet, из конфига доставать функцию, которая получает сектор и т.п. наверное, если подумать, то можно написать без этого всего. как-то так: someFunc = do sectorNo <- getWord32le count <- getWord32le sector <- getSector return $ ... sector sectorNo count

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта