![]() |
|
v8: Побайтовая запись в файл | ☑ | ||
---|---|---|---|---|
0
Alex_1987
29.04.10
✎
07:33
|
Добрый день! Помогите пожалуйста, уважаемые знатоки!
Возможно вопрос глупый но тем не менее)) Платформа 8.2. Есть массив, в нем хранятся Ascii коды символов. Надо тупо создать файл и записать его туда 1элемент -> 1байт. делаю так: К = 0; Текст = Новый ЗаписьТекста("D:\1.txt"); Пока К <= Массив.ВГраница() Цикл Текст.Записать(Символ(Массив[К])); К = К+1; КонецЦикла; Текст.Закрыть(); Все нормально за исключением того, что в начале файла приписываются три каких-то неопознанных символа? Что это??!! Это как то связано с настройками "переносов-разделителей"? Но что они тогда делают в начале файла?? |
|||
1
kitt
29.04.10
✎
07:40
|
это кодировка UTF-8
|
|||
2
skunk
29.04.10
✎
07:40
|
не могет быть в текстовом файле символа с кодом зеро
|
|||
3
kitt
29.04.10
✎
07:47
|
вообще может. Просто 1С не сможет его туда записать и прочитать штатными средствами. Хотя нет, прочитать сможет, через ДвоичныеДанные.
|
|||
4
Alex_1987
29.04.10
✎
07:49
|
(1) да
(2) еще как могет, отлично все записывает. И зеро и не зеро. |
|||
5
Alex_1987
29.04.10
✎
07:50
|
(2) И кто сказал что это текстовый файл?
|
|||
6
Alex_1987
29.04.10
✎
07:52
|
Это будет windows meta file, но это уже отдельная история.
|
|||
7
Alex_1987
29.04.10
✎
07:54
|
(3)>> Просто 1С не сможет его туда записать и прочитать штатными средствами.
Пример в (0) записывает. |
|||
8
Alex_1987
29.04.10
✎
08:17
|
Вообще задача состоит в том что бы записать картинку, которую содержит массив в формате wmf, в хранилище значения.
|
|||
9
Alex_1987
29.04.10
✎
08:48
|
http://en.wikipedia.org/wiki/Byte_order_mark
Нашел статью, где сказано что эти три байта - обозначают кодировку файла, для чтения другими программами. И что то мне подсказывает что заставить 1с не писать их не получиться... |
|||
10
Alex_1987
29.04.10
✎
08:51
|
(1) - теперь ясно, я думал это вопрос...
|
|||
11
skunk
29.04.10
✎
08:51
|
пиши через fso
|
|||
12
H A D G E H O G s
29.04.10
✎
08:54
|
Не вижу проблемы
|
|||
13
H A D G E H O G s
29.04.10
✎
08:56
|
Текст = Новый ЗаписьТекста("D:\1.txt",КодировкаТекста.ANSI);
|
|||
14
H A D G E H O G s
29.04.10
✎
08:57
|
Записать то ты его сможешь.
Прочитать - скорее всего нет. |
|||
15
Alex_1987
29.04.10
✎
09:16
|
(13) В ANSI нули не катят. Кроме того "ЗАПИСЬ ТЕКСТА" приписывает в начале файла кодировку.
(14) Читать я его буду так: Картинка = Новый Картинка("..."); (11) Книга знаний: Пример чтения и записи текстовых файлов (Scripting.FileSystemObject) О таком я не знал. Спасибо! Это наверное то что нужно. Щас погуглю на эту тему. |
|||
16
Alex_1987
29.04.10
✎
09:19
|
http://msdn.microsoft.com/en-us/library/6tkce7xa(v=VS.85).aspx
вот тут все что надо щас попробую реализовать. |
|||
17
H A D G E H O G s
29.04.10
✎
09:23
|
(16) Ты не прав.
Запись=Новый ЗаписьТекста("C:\text.txt",КодировкаТекста.ANSI); Запись.Записать(Символ(0)); Запись.Записать(Символ(0)); Запись.Записать(Символ(0)); Запись.Закрыть(); Открываем text.txt FAR-ом, нажимаем HEX и, о чудо, видим: |
|||
18
H A D G E H O G s
29.04.10
✎
09:26
|
||||
19
Alex_1987
29.04.10
✎
09:36
|
Да я не прав. Fso не помогла,кстати, там тоже эта хрень дописывается в начале.
Зато FSO упала при помещении в файл символа с кодом 148. Т.е. символ из дополнительной таблицы ASCII, а кодировка как говорил H A D G E H O G s, как раз была ASCII. Когда я делаю как в (13) файл после метода Текст.Закрыть(); вообще исчезает!!! |
|||
20
Alex_1987
29.04.10
✎
09:37
|
Вот я и подумал сначала что это изза нулей.
|
|||
21
Alex_1987
29.04.10
✎
09:39
|
Всмысле ansi-кодировка... оговорился...
|
|||
22
H A D G E H O G s
29.04.10
✎
09:45
|
(19)
<<Когда я делаю как в (13) файл после метода Текст.Закрыть(); вообще исчезает!!!>> Код полностью приведи. |
|||
23
Alex_1987
29.04.10
✎
09:53
|
Массив = ComSA.Выгрузить();
К = 0; Текст = Новый ЗаписьТекста("D:\1.txt", КодировкаТекста.ANSI); Пока К <= Массив.ВГраница() Цикл Текст.Записать(Символ(Массив[К])); К = К+1; КонецЦикла; Текст.Закрыть(); COMSA - это comsafearray. Причем попробовал для интереса сделать цикл до десяти, все записалось нормально. |
|||
24
Alex_1987
29.04.10
✎
09:58
|
О! Кажется я догнал! Символ возвращает символ в unicode. Поэтому если сделать так
Запись=Новый ЗаписьТекста("C:\text.txt",КодировкаТекста.ANSI); Запись.Записать(Символ(148)); Запись.Закрыть(); |
|||
25
Alex_1987
29.04.10
✎
09:59
|
то запишется 3F , а не 94, что требуется...
|
|||
26
Alex_1987
29.04.10
✎
10:00
|
Но почему файл исчезает все равно не понятно..
|
|||
27
H A D G E H O G s
29.04.10
✎
10:18
|
Вкурил, почему так.
Вот, попробуй этот казус развития кодировок Запись=Новый ЗаписьТекста("C:\text.txt","ISO-8859-1"); |
|||
28
H A D G E H O G s
29.04.10
✎
10:20
|
А почему файл изчезает - сказать не могу
|
|||
29
Alex_1987
29.04.10
✎
11:20
|
Спасибо О.Г.Р.О.М.Н.О.Е.! Все заработало!
А можно вкратце?? Как дошел до сией гениальной мысли?? |
|||
30
H A D G E H O G s
29.04.10
✎
11:23
|
(29) Ползанием по гиперссылкам Википедии
http://ru.wikipedia.org/wiki/Latin1 В Юникоде первые 256 кодовых позиций совпадают с ISO-8859-1. |
|||
31
H A D G E H O G s
29.04.10
✎
11:24
|
ISO-8859-1 совпадает с unicode (читаем utf-8) по символам, а записывается в файл как ANSI - 1 символ - 1 байт.
|
|||
32
Alex_1987
29.04.10
✎
11:26
|
Thank u very much!!
|
|||
33
Alex_1987
04.05.10
✎
08:59
|
Еще раз всем здрасьте!
Небольшое уточнение, в конечном варианте оказалось что и ЭТО не работает. Очень долго тупил что не так, ибо вместо символа 0A записывались два символа 0D 0A. А потом до меня дошло, что это указывается в параметрах проклятой "ЗаписиТекста", при записи в файл ставит символ переноса строки. Т.о. взлетело все окончательно так: Текст = Новый ЗаписьТекста("C:\sw5temp.wmf","ISO-8859-1",,,Символы.ПС); - таким образом 0a заменяется на 0а, а не на 0D 0A. А исчезновение файла было связвно именно с этим казусом. Когда надо было записать символ десять скажем в тысячный байт файла, на методе "записать", файл просто исчезал! Не ясно почему(( Happy end) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |