Имя: Пароль:
1C
1C 7.7
v7: BinaryData.ReadString() проблема с чтением данных
0 andrewks
 
02.09.11
08:57
решил я тут заюзать класс BinaryData (1С++) для чтения данных. но вот незадача - не получается считывать данные ни через ReadString, ни через ReadData, возвращает всегда резалт = 0. вот пример тестового кода:


   Перем ТекСтр;
   
   Если ЗагрузитьКомпоненту()<>1 Тогда
       Возврат;
   КонецЕсли;
   
   ИмяФайла1="D:\text1.txt";
   ИмяФайла2="D:\text2.txt";
   
   Попытка
       SF=СоздатьОбъект("BinaryData");
   Исключение
       Сообщить("Не удалось создать класс BinaryData","!");
   КонецПопытки;
   
   Если SF.LoadFromFile(ИмяФайла1,0)=1 Тогда
       Сообщить("Файл "+ИмяФайла1+" успешно прочитан.");
       Сообщить("Объём данных: "+SF.Size()+" байт");
       //Рез=SF.ReadString(ТекСтр);
       Рез=SF.ПрочитатьСтроку(ТекСтр);
       Сообщить("Рез = "+Рез+", ТекСтр = "+ТекСтр);
       
   КонецЕсли;
   SF.WriteString("Это новая строка!",0);
   
   Если SF.SaveToFile(ИмяФайла2,0)=1 Тогда
       Сообщить("Файл "+ИмяФайла2+" успешно записан.");
       Сообщить("Объём данных: "+SF.Size()+" байт");
   КонецЕсли;



резалт:
Файл D:\text1.txt успешно прочитан.
Объём данных: 1067 байт
Рез = 0, ТекСтр =
Файл D:\text2.txt успешно записан.
Объём данных: 1086 байт

т.е. данные он считывает нормально, строку дописывает, в файл сохраняет нормуль, строка дописанная есть.

а что не так с чтением?
1 andrewks
 
02.09.11
08:59
забыл:
пробовал на разных версиях 1с++ (и на стабильной 2.5, и на дэвел 3.2.3), всё едино
2 1Сергей
 
02.09.11
09:00
не вижу кода с ReadText()
3 andrewks
 
02.09.11
09:01
(2) Рез=SF.ReadString(ТекСтр);
4 andrewks
 
02.09.11
09:02
(2) сорри, ошибся в названии метода.  исправил топик.
5 1Сергей
 
02.09.11
09:07
попробуй
Рез=SF.ReadString(ТекСтр,0);
6 andrewks
 
02.09.11
09:09
(5) да уж по всякому пробовал, и так, и ReadData,  всегда возвращает резалт = 0, и в данных пустота
7 andrewks
 
02.09.11
09:10
и на разных компах/осях пробовал. итог один
8 Ёпрст
 
02.09.11
09:12
(0)
ПрочитатьСтроку(<?>)
Синтаксис:
ПрочитатьСтроку(<strData>,<nLen>)
Назначение:
функция читает строку из данных объекта.
Параметры:
<strData> строка, для приема прочитанных данных.
<nLen> режим чтения или длина;
0 - чтение строки, с терминатором CR LF, при этом чтение может завершиться, если встретится байт со значением 0; текущая позиция внутреннего указателя будет всегда за терминатором; также может произойти чтение до конца данных, при этом в strData будет прочитанная строка, и функция вернет 1 (0 функция вернет при следующем вызове).
Иначе - чтение строки указанной длины. Если данных не достаточно или на этой длине встречается байт со значением 0, происходит исключение. По умолчанию 0.
Возвращаемое значение
1 - строка прочитана, 0 - достигнут конец файла.
9 andrewks
 
02.09.11
09:13
(8) прочитал уже это до дыр.
проблема в том, что не пашет
10 1Сергей
 
02.09.11
09:16
(9) последнюю строчку прочти :)
11 andrewks
 
02.09.11
09:17
(10) "Объём данных: 1067 байт "
данные есть!
12 Ёпрст
 
02.09.11
09:17
(9) после загрузки файла сделай
SF.Перейти(0,0)
13 1Сергей
 
02.09.11
09:19
(11) не тупи

//Рез=SF.ReadString(ТекСтр);
SF.ReadString(ТекСтр);
14 1Сергей
 
02.09.11
09:20
(13)-1
15 1Сергей
 
02.09.11
09:20
(13) сам не тупи :)
16 andrewks
 
02.09.11
09:21
(12) пля.... и чё бы в документации это не отразить, что после загрузки указатель в конец прыгает.

действительно, в этом трабл был.

кстати, у них в описалове ещё и Encoding врёт.

все значения указаны +1 (т.е. написано, что 1 - ANSI (по умолчанию), а на самом деле ANSI - 0)
17 andrewks
 
02.09.11
09:22
всем спасибо, особенно Ёпрст3
18 1Сергей
 
02.09.11
09:22
(16) это у тебя СП кто-то спёр и неправильный подсунул.
У меня:

Кодировка
(чтение/запись) - Число
Содержит текущую кодировку, в которой будет происходить чтение и запись строк.
0 - ANSI (по умолчанию);
1 - OEM;
2 - UTF-16(LE);
3 - UTF-8.
19 andrewks
 
02.09.11
09:23
(18) я онлайн пользуюсь:
http://www.1cpp.ru/docum/icpp/html/BinaryData.html#encoding

ниавно думаю ,что там версия посвежее и более правильная )))