OberonCore https://forum.oberoncore.ru/ |
|
Текстовый файл. Чтение и запись. Конец файла. https://forum.oberoncore.ru/viewtopic.php?f=35&t=5398 |
Страница 1 из 1 |
Автор: | Александр Богданов [ Пятница, 24 Апрель, 2015 12:49 ] |
Заголовок сообщения: | Текстовый файл. Чтение и запись. Конец файла. |
Добрый день. Пытаюсь работать с текстовыми файлами. Столкнулся с следующими вопросами: 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 ] |
Заголовок сообщения: | Re: Текстовый файл. Чтение и запись. Конец файла. |
Посмотрите пример ObxAscii |
Автор: | Роман М. [ Пятница, 24 Апрель, 2015 16:21 ] |
Заголовок сообщения: | Re: Текстовый файл. Чтение и запись. Конец файла. |
1. Вот эта строчка не имеет смысла Александр Богданов писал(а): Код: Log.Bool(rd.rider.eof); внутри цикла WHILE ~rd.rider.eof DO так как внутри цикла она всегда имеет постоянное значение. 2. Цитата: Вопрос: - В какой кодировке должны быть текстовые файлы для ПК? и возможно ли задать нужную мне кодировку (обработанные файлы планируется использовать под win7). В дистрибутиве ББ версии 1.6 есть поддержка следующих кодировок (см. файл HostTextConv):
В ОС 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 ] | ||
Заголовок сообщения: | Re: Текстовый файл. Чтение и запись. Конец файла. | ||
Вот ещё вспомогательный модуль с примером для чтения файлов построчно.
|
Автор: | Александр Богданов [ Пятница, 24 Апрель, 2015 18:56 ] |
Заголовок сообщения: | Re: Текстовый файл. Чтение и запись. Конец файла. |
Спасибо всем за ответ! Роман М. писал(а): 1. Вот эта строчка не имеет смысла Александр Богданов писал(а): Код: Log.Bool(rd.rider.eof); внутри цикла WHILE ~rd.rider.eof DO так как внутри цикла она всегда имеет постоянное значение. Да, строка втиснута от "безысходности" - идет прерывание от переполнения индекса в операции считывания из файла. пока с этой ошибкой не разобрался. Роман М. писал(а): 2. Цитата: Вопрос: - В какой кодировке должны быть текстовые файлы для ПК? и возможно ли задать нужную мне кодировку (обработанные файлы планируется использовать под win7). В дистрибутиве ББ версии 1.6 есть поддержка следующих кодировок (см. файл HostTextConv):
В ОС 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 ] |
Заголовок сообщения: | Re: Текстовый файл. Чтение и запись. Конец файла. |
Иван Кузьмицкий писал(а): Посмотрите пример ObxAscii Спасибо. "взял" эту = ObxOpen0 |
Автор: | Valery Solovey [ Пятница, 24 Апрель, 2015 22:06 ] |
Заголовок сообщения: | Re: Текстовый файл. Чтение и запись. Конец файла. |
Полагаю, сообщение "индекс вне диапазона" выдаётся для массива, а не файла. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |