Файловые потоки и прочитатьСтроку

1. DenisCh 02.12.17 12:22 Сейчас в теме
Есть двоичный файл.
Читаем его через

	
ПотокИсходный          = ФайловыеПотоки.ОткрытьДляЧтения(ИмяФайла);
ЧтениеДанных           = Новый ЧтениеДанных(ПотокИсходный);


В нём есть кусок, который представляет zero-terminated string, то есть набор символов до первого Символ(0) (ну, как строки в С).

Пытаюсь читать

стр = ЧтениеДанных.ПрочитатьСтроку(КодировкаТекста.OEM, Строка(Символ(0)));


Поимеваю ошибку "неверный параметр 2".

Можно ли как-то одним махом прочитать весь кусок, а не циклом, проверяя очередной символ на 0?

ЗЫ. 1с 8.3.10
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spacecraft 02.12.17 13:59 Сейчас в теме
(1) можно попробовать вариант: ЧтениеДанных.ПрочитатьДо(Маркеры)

Маркеры = Новый Массив();
Маркеры.Добавить(Строка(Символ(0)));
РезультатЧтенияЧасть = ЧтениеДанных.ПрочитатьДо(Маркеры);
Если Не РезультатЧтенияЧасть.МаркерНайден Тогда
    Возврат;
КонецЕсли;
ЧтениеЧасти = Новый ЧтениеДанных(РезультатЧтенияЧасть.ОткрытьПотокДляЧтения());
Показать
3. DenisCh 02.12.17 14:39 Сейчас в теме
(2)
Маркеры = Новый Массив();
Маркеры.Добавить(Строка(Символ(0)));
РезультатЧтенияЧасть = ЧтениеДанных.ПрочитатьДо(Маркеры);


Да, так работает, но не совсем...

Функция ПрочитатьСтроку(ЧтениеДанных)
	Маркеры = Новый Массив();
	Маркеры.Добавить(Строка(Символ(0)));
	РезультатЧтенияЧасть = ЧтениеДанных.ПрочитатьДо(Маркеры);
	Если НЕ РезультатЧтенияЧасть.МаркерНайден Тогда
		Возврат "";
	КонецЕсли;
	ЧтениеСтрока = Новый ЧтениеДанных(РезультатЧтенияЧасть.ОткрытьПотокДляЧтения(), КодировкаТекста.OEM);
	Возврат ЧтениеСтрока.ПрочитатьСтроку();
КонецФункции
Показать


Однострочный текст читает хорошо, а вот многострочный (с переносами) - не хочет.
Если же читать как двоичные данные - опяь сведётся к посимвольному чтению...
4. spacecraft 02.12.17 15:16 Сейчас в теме
(3)
а вот многострочный (с переносами) - не хочет

Как вариант в маркеры добавить символ переноса. И в цикле получать все строки. Но уже отдельно каждую строку.
5. DenisCh 02.12.17 15:22 Сейчас в теме
(4) Что в цикле получать - это да, так я и сделал. Но хочется "одним махом всех побивахом".
То, что вместо 600 сложений строк будет 40 - греет, но от такого сильного загара не получишь. +10-15% скорости. Хочется большего.
6. spacecraft 02.12.17 15:26 Сейчас в теме
(5) хмм. Может все же: Возврат ЧтениеСтрока.Прочитать();
ПрочитатьСтроку в многострочном вернет только первую строку.
8. DenisCh 02.12.17 15:35 Сейчас в теме
(6)
Может все же: Возврат ЧтениеСтрока.Прочитать();


ЧтениеДанных (DataReader)
Прочитать (Read)
Синтаксис:

Прочитать(<Количество>)
Параметры:

<Количество> (необязательный)

Тип: Число.
Количество байтов, которые требуется прочитать. Если не задано, то выполняется чтение всех данных до конца потока.
Значение по умолчанию: Неопределено.
Возвращаемое значение:

Тип: РезультатЧтенияДанных.
Показать


Не катит.
10. spacecraft 02.12.17 15:42 Сейчас в теме
(8) согласен.
У 1С тоже в примерах есть:
Пока Истина Цикл
	Стр = ЧтениеЧасти.ПрочитатьСтроку();
	Если Стр = "" Тогда
		Прервать;
	КонецЕсли;
   // тут соединяем.
КонецЦикла
13. sulfur17 60 21.02.24 05:31 Сейчас в теме
(10) надо примерно так:
	Пока Не ЧтениеДанных.ЧтениеЗавершено Цикл
		Строка = ЧтениеДанных.ПрочитатьСтроку();
		Если Строка <> "" Тогда
			СтрокиДанных.Добавить(Строка);
		КонецЕсли;
	КонецЦикла;
	СтрокаДанных = СтрСоединить(СтрокиДанных, Символы.ПС);
Показать
7. spacecraft 02.12.17 15:28 Сейчас в теме
(3)
Если же читать как двоичные данные - опяь сведётся к посимвольному чтению...

А тут Если знаем, что там двоичные данные, то совсем просто:
Возврат ЧтениеСтрока.Прочитать().ПолучитьДвоичныеДанные();
9. DenisCh 02.12.17 15:37 Сейчас в теме
(7)
А тут Если знаем, что там двоичные данные, то совсем просто:

Мы тут знаем (по построению и спецификации формата), что там многострочная строка в кодировке 866. Причём почти (за исключением нескольких символов (Символ(1)) в начале строки) вся - человекочитаемая, для чего, собственно, и предназначена.
11. spacecraft 02.12.17 15:43 Сейчас в теме
(9) тут имелось ввиду двоичные данные типа картинка (как вариант).
12. DenisCh 02.12.17 15:48 Сейчас в теме
(11) Не, у меня там картинок как двоичных данных не будет в принципе. By design. А если будет - то будет чайником чайнику по чайнику ))))

(10) переделать на вариант как в (2) (3) - скорость пока приемлемая. Спасибо за подсказку. Сам не заметил, старею...
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот