Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Для чтения бинарных файлов Код: plaintext 1. 2. 3. Код: plaintext То есть если сделать Код: plaintext 1. Разве это правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 12:57 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Я так вообще возмущённ отсутствием чтения "построчно"! ---------- Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 13:19 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Не, построчно то у них как раз все есть, а вот с бинарными хитро оказалось. Я то до этого вообще думал, что бинарное чтение - это "формат потока", флаг S. Долго мучался, пришлось перечитывать на буржуинском непонятном языке документацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 13:41 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Блок А.Н.Не, построчно то у них как раз все есть И как это делается? Запись есть. А вот про чтение как раз и небыло, я специально выяснял у IS... Правда это было еще не 5.0.*... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 13:47 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. PS: для работы с файлами как с потоком можно ещё использовать класс "%Library.FileBinaryStream". Или "%Stream.FileBinary" (с версии 2008.2). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 14:21 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
krvsa Это нужно режим чтения смотреть Код: plaintext 1. 2. 3. ---- Блок А.Н. А открывать с опцией ":F100" обязательно ? Почему не делать просто Read(100) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 14:41 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Ptn krvsa Это нужно режим чтения смотреть Таки все смотрели вместе с IS... Ничего там по строчкам не читает. Ptn Код: plaintext 1. 2. 3. Длиннее... А если короче? Ответ от IS был один - править или наследовать и править код класса. Т.ч. пока своими функция ми и обходимся... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 14:52 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
krvsaДлиннее... А если короче? То читает без проблем. Встречал проблемы на уникод версиях - так куда то исчезали первые два байта из строки, но это при чтении бинарных файлов. Переход на стримы решал проблему. Вот вам еще пример работающего кода - я его тут уже как приводил Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 15:27 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
PtnТо читает без проблем. Буду знать... Потестирую при случае. Поставить 32000 можно без проблем... Пущай читает! Таких длинных строк у нас вроде еще небыло. PtnВот вам еще пример работающего кода - я его тут уже как приводил Вариант без класса есть и у нас... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 15:30 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
А это не опечатка? Код: plaintext 1. 2. 3. 4. 5. разные идентификаторы... ---------- Cache for Windows (x86-32) 2007.1.3 (Build 607) Wed Oct 17 2007 02:12:09 EDT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 15:33 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
krvsaА это не опечатка? Она родимая - вот еще пример реального кода - читает текстовый файл с разделитялями - аля csv [src] LoadFile(jkey,global,file,skipcount=0,comment="#",delimiter) set delimiter=$g(delimiter,$c(9)) new j,stream,in,len,in,L,i,header set comment(0)=$l(comment) set:+skipcount<0 skipcount=0 set i="" for { set i=$o(@global@(jkey,i)) quit:i="" kill @global@(jkey,i) } set stream=##class(%File).%New(file) do stream.Open("R") set in="",j=0 for { w $C(13),j set len=30000,in=stream.Read(.len) quit:len=-1 continue:$i(skipcount,-1)>0 set in=$ZCVT($ZSTRIP(in,"<>W"),"U") if comment'="" { if $e(in,comment(0))=comment { set in=$e(in,comment(0)+1,$l(in)) if '(in["=") { continue } set header=$ZSTRIP($p(in,"=",1),"<>W") if (header'="")&&('(header[" ")) { set @global@(jkey,"header",header)=$ZSTRIP($p(in,"=",2),"<>W") } continue } } set L=$l(in,delimiter),in("empty")=1,in("list")="" for i=1:1:L { set in("element")=$zstrip($p(in,delimiter,i),"<>W") set:in("element")'="" in("empty")=0 set in("list")=in("list")_$lb(in("element")) } s:in("empty")=0 j=j+1,@global@(jkey,"rows",$i(@global@(jkey,"rows")))=in("list") } set stream="" quit [src] Читает файл в глобал указанный в виде строки, с начальным индексом jkey, с указанием пропускать skipcount строк, и считать строчки начинающие с comment комментариями в качеств разделителя полей используется delimiter ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 15:45 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
тег src не закрыл - думаю разберетесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 15:46 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Блок А.Н. То есть если сделать Код: plaintext 1. Разве это правильно? Правильно. Так как в Read() вы задаете не размер считываемого блока, а число символов, разрешенных на запись в переменную (см. описание параметров команды READ). Единственное исключение - первый и последний Read() из файла, результаты которых ограничены размером считываемого блока (не знаю, с чем это связано - или баг, или "фича"). krvsaБлок А.Н.Не, построчно то у них как раз все есть И как это делается? Запись есть. А вот про чтение как раз и небыло, я специально выяснял у IS... Правда это было еще не 5.0.*... У классов %Library.FileCharacterStream и %Library.GlobalCharacterStream есть функция ReadLine(). Разделитель строк задается свойством LineTerminator. (Фактически эта функция есть у любого класса, наследуемого от %Library.SerialStream.) servit Код: plaintext 1. 2. 3. 4. Значит, есть что-то машино/ОС/ФС-зависимое в этих функциях. У меня от исходного Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. Из-за этой неопределенности с флагом "F" я предпочитаю пользоваться флагом "U" для бинарных файлов и задаю необходимую мне длину при вызове Read(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 15:57 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Turk, спасибо за флаг U, наверное он в моем случае больше подходит. А в случае с "RF" даже Код: plaintext Servit, вы каким-нибудь тоталкомандером проверьте, действительно ли одинаковыми получились файлы или может быть дырки просто забило какими-нибудь нулями? Я тестил под WinXP-32bit SP2, Cache 2008.2.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 16:35 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Ptnдумаю разберетесь Лишь бы строки читал... Там-то справимся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 16:55 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Чтение файла построчно (с версии 5.1): Код: plaintext 1. 2. 3. 4. 5. 6. 7. TurkЗначит, есть что-то машино/ОС/ФС-зависимое в этих функциях. Локаль - rus w ; NTFS; Windows XP. В техподдержку обращались? Блок А.Н.Servit, вы каким-нибудь тоталкомандером проверьте, действительно ли одинаковыми получились файлы или может быть дырки просто забило какими-нибудь нулями? Содержимое файла совпадает в Far'е и терминале. Файл boot.ini: Код: plaintext 1. 2. 3. 4. 5. Программа: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. Программа: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 17:01 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
servit TurkЗначит, есть что-то машино/ОС/ФС-зависимое в этих функциях. Локаль - rus w ; NTFS; Windows XP. Локаль - ruw8 (и на Cache 5.0, и на Cache 2009.1). ФС - пробовал на NTFS и FAT32. ОС - Windows XP Pro SP2. servitВ техподдержку обращались? Пока нет необходимости - в рабочем коде флаг "F" не используем. (К тому же, иногда быстрее самим разобраться в проблеме и лишь потом выкладывать ее на WRC.) С вторым примером все понятно - нельзя считать больше, чем размер блока, заданный в Open(). Проблема кроется где-то в связке OPEN/USE/READ, потому что код без класса дает аналогичный результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 18:31 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
у меня программа Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. (из дома) Кстати, Servit, а у вас программа хоть файл и не калечит, но работает то тоже неправильно: Read(1), а считывает по факту по 10 байт, то есть параметр игнорирует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2009, 18:34 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Пример у Вас не работает из-за того, что в локали ruw8 кодировка по умолчанию для файлов - RAW . Если поменять, например, на UTF8 , то код выше заработает. Или можно кодировку указать непосредственно при открытии файла: Код: plaintext Код работает согласно документации . То есть данные читаются пакетами (порциями) фиксированной длины. Это легко проверить: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. PS: если вопросов больше нет, предлагаю для разминки решить средствами Caché задачу с Олимпиады-2009 по Oracle, опубликованную на соседнем форуме. Предлагаю свой вариант решения при Undefined=2 (код лучше смотреть при наличии собственного решения): COS-код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Эта статья может пригодиться при решении задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2009, 08:58 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
servitКод работает согласно документации . То есть данные читаются пакетами (порциями) фиксированной длины. Там ничего не сказано о том, что при заданной кодировке (т.е. отличной от RAW) количество считанных символов в READ будет отличаться от задаваемого. (Да и в RAW эта проблема тоже есть для первого и последнего READ из файла.) Зато в той же документации написано: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2009, 11:55 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
servit, s q=0 f n="M","C","X","I" s q=$l(rim,n)-1'<3+q i q'<3 s sum=sum+i q С Новым MMX годом ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.12.2009, 23:00 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Вопрос почти по теме. Нужно записать строки из глобала в файл, созданный для записи. Есть код: Код: plaintext 1. 2. 3. Поскажите, где можно найти более подробную информацию по этим функциям и что они означают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 14:53 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
OstikaПоскажите, где можно найти более подробную информацию по этим функциям Это не функции... Это экземпляр класса и его методы... Открой документацию Каше... Зайди в Класс референс... Найди пакет %system... Найди там класс File... Далее знакомься с его свойствами и методами. Ostikaчто они означают? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:05 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
и зачем вводить в заблуждение, пакет не %system, а %Library ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:12 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
Нвводил... Ошибся... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:14 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
На самом деле информацию по ключам работы с файлами в документации каше хрен найдешь. Ни из Документации по OPEN, ни из документации по %Library.File ссылки на нужное место не идут, либо теряются среди кучи абсолютно мне ненужных ссылок, по крайней мере для меня проблема найти нужные ключи. В вашем случае WNKS:/IOTABLE=""RAW""" W - Write N - New (будет создавать файл, по-моему всегда затирая предыдущий) A - дописывать файл K - не знаю, и вряд ли он нужен S - Stream - формат потока. Непонятно что это значит, но он будет считывать файл построчно, причем переводы строки будет менять по своему усмотрению. Подходит только для текстовых файлов. Таблица перекодировки (IOTABLE) нужна только для текстовых режимов, и RAW означает отсутвие перекодировки, кажется это по умолчанию. А вообще в классах есть всякие %BinaryFile и т.д., там режимы уже выставлены по умолчанию. Но все классы - это только оболочка для команды OPEN,WRITE,USE,READ,CLOSE ит.д., сделаны для удобства. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:16 |
|
||
|
Расстроило вот
|
|||
|---|---|---|---|
|
#18+
А, вот ваши ключи http://docs.intersystems.com/cache20101/csp/docbook/DocBook.UI.Page.cls?KEY=GIOD_rmsseqfiles ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2010, 15:23 |
|
||
|
|

start [/forum/topic.php?all=1&fid=39&tid=1557970]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 252ms |
| total: | 415ms |

| 0 / 0 |
