Имя: Пароль:
1C
 
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)