OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 20 Октябрь, 2019 22:49

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: Пятница, 24 Апрель, 2015 12:49 

Зарегистрирован: Суббота, 18 Апрель, 2015 16:18
Сообщения: 5
Добрый день.
Пытаюсь работать с текстовыми файлами. Столкнулся с следующими вопросами:
1. модуль Files пишет/читает только BYTE (возможно я неправ). Перевести в CHAR (SHOPTCHAR) не смог (
2. нашел пример чтения/запись "через" модуль Stores.
С циклами FOR (чтение) работает, а вот при WHILE ~rd.rider.eof DO выдает системное прерывание "индекс вне диапазона" - пролетает проверку конца файла (специально выводил в лог).
Код:
PROCEDURE GetFile*;
      VAR
         f: Files.File;
         rd: Stores.Reader;
         loc: Files.Locator;
         res: INTEGER;
         t:    ARRAY 256 OF CHAR;
         a: INTEGER;
   BEGIN
      (*- Определение директория -*)
      loc := Files.dir.This("");
      loc := loc.This("Streets.txt");
      (*- Определение файловой переменной -*)
      f := Files.dir.Old(loc, "Streets.txt", Files.shared);
      rd.ConnectTo(f);
      a:=0;
      rd.ReadString(t);
      (*- Операция чтения -*)
      WHILE ~rd.rider.eof DO
         Log.Ln; Log.String(t);
         Log.Bool(rd.rider.eof);
         a:=a+1;
         rd.ReadString(t);
      END;
      Log.Int(a);
   END GetFile;


следующая проблема:
- записанные текстовые файлы ПК под win7 не читаются - даже определить кодировку не могу (
- при чтении файлов созданных в nootepad обратная проблема: ББ выдает абракадабру.
Вопрос:
- В какой кодировке должны быть текстовые файлы для ПК? и возможно ли задать нужную мне кодировку (обработанные файлы планируется использовать под win7).

Буду признателен за пояснения или ссылку по данной теме.
Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Апрель, 2015 13:10 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2931
Откуда: г. Ярославль
Посмотрите пример ObxAscii


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Апрель, 2015 16:21 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
1.
Вот эта строчка не имеет смысла
Александр Богданов писал(а):
Код:
Log.Bool(rd.rider.eof);

внутри цикла WHILE ~rd.rider.eof DO
так как внутри цикла она всегда имеет постоянное значение.

2.
Цитата:
Вопрос:
- В какой кодировке должны быть текстовые файлы для ПК? и возможно ли задать нужную мне кодировку (обработанные файлы планируется использовать под win7).

В дистрибутиве ББ версии 1.6 есть поддержка следующих кодировок (см. файл HostTextConv):
  1. ASCII (ImportDosText) - 8-битная
  2. Latin1 ? (ImportText) - надмножество ASCII с некоторыми латинскими знаками - 8-битная.
  3. UCS2 (ImportUnicode) - предшественник UTF-16 - с фиксированной длиной кодовой последовательности 16 бит.

В ОС Windows кодировкой Unicode обозначают UTF-16 Little Endian. Notepad из Windows 7 умеет сохранять в разных кодировках. Лучше выбрать Unicode.
Если я не ошибаюсь, для диапазона знаков из базовой плоскости языков Юникода (по правде, должного называться Уникодом), UCS2 и UTF-16 - тождественно равны.

Откроем секцию инициализации модуля ObxAscii:
Код:
BEGIN
   conv := Converters.list;
   WHILE (conv # NIL) & (conv.imp # "HostTextConv.ImportText") DO
      conv := conv.next
   END
END ObxAscii.

Отсюда мы видим, что по умолчанию используется конвертер HostTextConv.ImportText, то есть кодировка Latin1.

Затем процедуру ObxAscii.Open
Код:
   PROCEDURE Open* (loc: Files.Locator; IN name: ARRAY OF CHAR): Text;
      VAR s: Stores.Store; fname: Files.Name; text: Text;
   BEGIN
      IF loc = NIL THEN PathToFileSpec(name, loc, fname) ELSE fname := name$ END;
      IF loc.res = 0 THEN
         Converters.Import(loc, fname, conv, s);
         IF (s # NIL) & (s IS TextViews.View) THEN
            NEW(text); text.reading := TRUE; text.scan.ConnectTo(s(TextViews.View).ThisModel());
            RETURN text
         ELSE RETURN NIL
         END
      ELSE RETURN NIL
      END
   END Open;

Здесь используется ранее установленный при инициализации конвертер conv.
Нужно установить конвертер conv для работы с другими кодировками, подставив название нужной процедуры вместо "HostTextConv.ImportText".

Таким образом, сохранив текстовый документ в Notepad,
читаем в ББ содержимое после установки конвертера в "HostTextConv.ImportUnicode".


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Апрель, 2015 17:47 
Аватара пользователя

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1162
Откуда: Tel-Aviv
Вот ещё вспомогательный модуль с примером для чтения файлов построчно.


Вложения:
AsciiRead.zip [4 КБ]
Скачиваний: 128
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Апрель, 2015 18:56 

Зарегистрирован: Суббота, 18 Апрель, 2015 16:18
Сообщения: 5
Спасибо всем за ответ!
Роман М. писал(а):
1.
Вот эта строчка не имеет смысла
Александр Богданов писал(а):
Код:
Log.Bool(rd.rider.eof);

внутри цикла WHILE ~rd.rider.eof DO
так как внутри цикла она всегда имеет постоянное значение.


Да, строка втиснута от "безысходности" - идет прерывание от переполнения индекса в операции считывания из файла.
пока с этой ошибкой не разобрался.

Роман М. писал(а):
2.
Цитата:
Вопрос:
- В какой кодировке должны быть текстовые файлы для ПК? и возможно ли задать нужную мне кодировку (обработанные файлы планируется использовать под win7).

В дистрибутиве ББ версии 1.6 есть поддержка следующих кодировок (см. файл HostTextConv):
  1. ASCII (ImportDosText) - 8-битная
  2. Latin1 ? (ImportText) - надмножество ASCII с некоторыми латинскими знаками - 8-битная.
  3. UCS2 (ImportUnicode) - предшественник UTF-16 - с фиксированной длиной кодовой последовательности 16 бит.

В ОС Windows кодировкой Unicode обозначают UTF-16 Little Endian. Notepad из Windows 7 умеет сохранять в разных кодировках. Лучше выбрать Unicode.
... UCS2 и UTF-16 - тождественно равны.

Подумав, решил работать с кодировкой Unicode, а не Ascii.
Проблема решилась просто (перебором кодировок и расширений):
- исходный файл в Ascii Nootepad-ом перегнал в UCS-2 Little Endian;
- изменил расширение файла (данных) с "txt" на "utf" - без этого ББ продолжал выдавать абракадабру.
Роман М. писал(а):
...
Таким образом, сохранив текстовый документ в Notepad,
читаем в ББ содержимое после установки конвертера в "HostTextConv.ImportUnicode".

с конвертерами пока не разобрался. Ни чего не устанавливал - заработало без установки.
Возможно это потребуется, что бы не быть "привязанным" к расширению файла...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Апрель, 2015 18:58 

Зарегистрирован: Суббота, 18 Апрель, 2015 16:18
Сообщения: 5
Иван Кузьмицкий писал(а):
Посмотрите пример ObxAscii

Спасибо.
"взял" эту = ObxOpen0  


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 24 Апрель, 2015 22:06 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Полагаю, сообщение "индекс вне диапазона" выдаётся для массива, а не файла.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2019, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB