Имя: Пароль:
1C
1С v8
Запись в файл строки определенного размера
,
0 Kondarat
 
24.09.13
09:32
Суть задачи такова: необходимо сформировать файл определенного наименования и расширения для последующей его обработки в сторонней программе. Требования к структуре таковы: каждая запись должна быть размером ровно 21 байт и иметь такую структуру:
Поле_1 - 14 байт
Поле_2 - 4 байта
Поле_3 - 2 байта
Поле_4 - 1 байт
При этом 1,3,4 поля могут быть буквенно - цифровыми, 2 - число должно быть приведено к формату unsigned long (C/C++ convention).
Например Число 105000 - 28 9A 01 00.
На просторах этого форума нашел как преобразовать число и записать в файл. Однако есть вопрос.
Например: Поле_1 = 123ВПАВП12 (10 символов) достаточно ли дополнить его 4-мя пробелами, чтобы получилось 14 байт? И как записать пустой символ, например для Поля_4 если он не задан? Один пробел?
1 Fish
 
24.09.13
09:47
(0) Про dbf когда-нибудь слышал?
2 Kondarat
 
24.09.13
09:49
(1) Слышал. Ну и...?
3 Fish
 
24.09.13
09:51
(2) Вот он и предназначен для хранения данных заданной структуры. И не надо ничего изобретать.
4 Infsams654
 
24.09.13
09:51
(0) Поле_х = Прав("                            " + Поле_х, НужноеКоличество);
5 Kondarat
 
24.09.13
10:01
(3) Если бы требовался файл формата dbf вопроса на форуме не появилось бы.
6 Infsams654
 
24.09.13
10:01
(5) ну а все-таки (4) попробуй
7 Kondarat
 
24.09.13
10:02
(4) Т. е. пробелы должны быть перед Поле_х. Так?
8 Infsams654
 
24.09.13
10:11
(7) а что не Так?
Поле_1 - 14 байт
Поле_2 - 4 байта
Поле_3 - 2 байта
Поле_4 - 1 байт

Заполняешь слева пробелами и берешь правые символы в нужном количестве.
9 Infsams654
 
24.09.13
10:19
(7) если непонятно (Поле_2) как сделать строковое представление числа в 16-чном виде, то на эту тему много всего есть, например, DEC -> HEX. Как?
10 Кирпич
 
24.09.13
10:20
(0)А просто попробовать и посмотреть что получится?
11 Kondarat
 
24.09.13
10:24
(10) Пробую конечно. Не жду окончательного решения здесь. Просто в теме не очень силен.
12 le_
 
24.09.13
10:29
(0) В ASCII один символ - 1 байт. В UTF-8 один символ - 2 байта. Плюс еще есть непечатные символы, признак конца строки, возврат каретки и пр.
13 Kondarat
 
24.09.13
10:39
(12) Тут буржуйское описание. Записи должны быть отсортированы по первому полю(ASCII-sorted ) и не иметь в конце символов CRLF.
Получается для 1,3,4 поля достаточно сделать как в (4)
14 Infsams654
 
24.09.13
10:43
(11) да, еще, не забудь, про неразрывный пробел, пользуй для преобразования числа в строку Формат(ТоЧисло, "ЧГ = 0");.

ну и как пишет (12), надо преобразовать из UTF

Функция КодСимволаASCII(Символ)
   КодUNICODE = КодСимвола(Символ);
   Если ((КодUNICODE > 1039) И (КодUNICODE < 1104)) Тогда
       Возврат (КодUNICODE - 848);
   ИначеЕсли КодUNICODE = 8470 Тогда
       Возврат 185;
   ИначеЕсли КодUNICODE = 1105 Тогда
       Возврат 184;
   ИначеЕсли КодUNICODE = 1025 Тогда
       Возврат 168;
   Иначе
       Возврат КодUNICODE;
   КонецЕсли;
КонецФункции
15 le_
 
24.09.13
10:47
(13) Думается мне, CRLF 1с-кой не отрезать.
16 Kondarat
 
24.09.13
10:48
(14) Преобразовать все поля?
17 Kondarat
 
24.09.13
10:49
(15) Я записываю в файл с помощью "Scripting.FileSystemObject"
18 Infsams654
 
24.09.13
10:54
(15) про CRLF ничего в (0) не сказано. Думается, что это все-таки построчно записывается.
Так, что все разжевано, что еще надо ?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.