Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
|

start [/forum/topic.php?fid=39&fpage=48&tid=1557970]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
28ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 221ms |
| total: | 366ms |

| 0 / 0 |
