Имя: Пароль:
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)
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший