Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.02.2017, 23:04   #1
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию Чтение из файла построчно переменных разного типа - Pascal ABC

Есть файл исходных данных input.txt. там содержатся данные о сети (точки начала и конца ветвей, марки провода и т.п.)
есть файл "каталог" с марками провода
Как проще всего и правльно читать эти данные из файлов ?
Пробовал примерно следующим образом
Код:
Assign(FT,'put/input.txt');
 Reset(FT);
 Readln(FT,WStr);
 Readln(FT,WStr);
 Val(Copy(WStr,49,4),N_Line,v);
 Readln(FT,WStr);
 for i:=1 to N_Line do 
 begin
  Readln(FT,N1[i],N2[i],Name_Line[i],LengLine[i]);
1. Можно ли как то проще прочитать значение числа линий ? Val(Copy(WStr,49,4),N_Line,v); выглядит косным решением
2. Какой разделитель должен быть между переменными в файле который читается с помощью Readln ? Каким образом читается string ? сейчас захватываются лишние пробелы (до и после значения марки провода Name_Line[i])
Вложения
Тип файла: rar программа.rar (5.0 Кб, 9 просмотров)
bdfy вне форума Ответить с цитированием
Старый 24.02.2017, 10:16   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Ваши данные форматированы. Каждый из параметров занимает определенное число знакомест.
Я бы описал тип запись со строковой переменной с указанием длины строки, и остальными переменными типа real. Читать данные можно через read(), завершая чтение последнего элемента строки процедурой readln().
Код:
type Tprovod=record;
     marka: string[19];
     x0, b0, b01, Id: real;
   end;

var provod: Tprovod;

while not eof(fh) do
begin
   read(provod.marka);
   read(provod.x0);
   ...
   readln(provod.Id);
... {Остальные операции}
end;
Ненужные пробелы в марке провода можно удалить. Остальные роли не сыграют.
PS: Сильно не старался


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.02.2017, 11:13   #3
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию

Цитата:
Ваши данные форматированы. Каждый из параметров занимает определенное число знакомест.
исходная программа была вообще на Fortran - оттуда и форматированный файл исходных данных. Но я не против изменить исходный файл. Как это сделать чтобы он проще читался ? Я не понимаю по какой логике Pascal читает переменные из строки командой Readln ? ладно числа - он как то их определяет чем не отделяй, а стринги читаются просто сразу после числа ? а если нужно прочитать два стринга подряд - как их можно отделить ?
bdfy вне форума Ответить с цитированием
Старый 24.02.2017, 15:59   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Цитата:
Но я не против изменить исходный файл. Как это сделать чтобы он проще читался ?
В вашем случае все нормально и ничего с файлом данных делать не надо.
В Паскале строки читаются следующим образом;
Если использовать read(), то из строки считывается столько символов, сколько поместится в переменную строкового типа, в которую вы читаете. Если у вас не одна, а несколько колонок текста с разным числом символов, то для каждой колонки описываете переменную string, задавая длину.
По умолчанию - переменная string имеет длину 256 байт (1-255 байты - символы, а 0 - число символов в строке).
readln() - читает строку до конца. Там, в конце, вставлены Cr (возврат каретки) и Lf (следующая строка). В том случае, когда в строке символов больше, чем помещается в переменную строкового типа, то в переменную передается нужное число символов и выполняется переход указателя на следующую строку. Т.е. не принятый хвост строки теряется.
Если читать строки с числами, то разделителем является пробел.
Считанное число преобразуется к типу переменной. Если обнаруживается не соответствие (должно быть целого типа, а в считанной подстроке есть разделитель - точка), то Error.
PS: Вам лучше поэкспериментировать для лучшего понимания. В качестве дополнительного пояснения предлагаю Т.А. Павловская, Программирование на ЯВУ, Паскаль. Есть в списке литературы, см. Важно. Литература, в конце списка.


Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.02.2017, 17:32   #5
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Если читать строки с числами, то разделителем является пробел.
если читаешь строку где число, а потом стринг - то разделителя словно совсем нет. все что сразу после числа уходит в этот стринг.
самое логичное это удалить все пробелы у некоторых переменных типа string. Как это сделать самым простым способом ?
bdfy вне форума Ответить с цитированием
Старый 24.02.2017, 17:59   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Да. К сожалению функционал работы со строками в Паскале не столь развит, как, например в VB, где есть куда как приличный набор.
Но вот на просторах сети есть такой сайт:
http://aix.ucoz.ru/publ/ne_standartn..._dr/24-1-0-506
Так понимаю, что это хорошее решение.

Как-то так, ...

PS: Но вот для Free Pascal:
http://www.freepascal.org/docs-html/...tils/trim.html
Так что ...
Как-то так, ...

Последний раз редактировалось ViktorR; 24.02.2017 в 18:05.
ViktorR вне форума Ответить с цитированием
Старый 24.02.2017, 23:20   #7
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Как раз в PascalABC.Net есть и Trim и многое другое из linq.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 25.02.2017, 19:36   #8
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию

Вот у меня установлен как раз PascalABC.Net но команды Replace и т.п. он не понимает (хотя они указаны в помощи). Я что-то подключить чтоли забыл ?
Изображения
Тип файла: jpg Clipboard02.jpg (54.5 Кб, 131 просмотров)
bdfy вне форума Ответить с цитированием
Старый 25.02.2017, 22:20   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,306
По умолчанию

Всякий раз, когда у вас возникает ошибка, открывайте поиск в сети и пишите запрос. Так будет существенно быстрее.
PascalABC - это объектно-ориентированный. Т.ч. прямой перенос из обычного Паскаля не тянет.
Может вам это поможет:
http://pascalabc.net/stati-po-pascal...o-vyrazhaemsya

Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 25.02.2017, 23:15   #10
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию

Спасибо ссылка помогла.
Не первый (и не последний) это язык который приходится осваивать. просто странно что в справке к языку (шли в пакете установки) указаны команды которые не работают.
Вот так получилось.
Код:
 Name_Line[i] := Regex.Replace(Name_Line[i],'\s','');
не могу вот в эту часть кода еще врубится
Код:
Readln(FT,WStr);
 Val(Copy(WStr,49,4),N_Line,v);
Это чтение числа линий (integer) из строки типа
Цитата:
Количество линий 11
к чему там переменная v которая нигде толком не используется ?

Последний раз редактировалось bdfy; 25.02.2017 в 23:35.
bdfy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из текстового файла данных для типа запись, Pascal. anton_guitar Помощь студентам 1 12.05.2015 20:59
Чтение из файла полей объекта разного формата Sheffdmb2010 Общие вопросы C/C++ 0 31.05.2013 21:48
чтение переменных из файла Игорь Кулакевич Помощь студентам 11 26.09.2011 19:03
Задача на сравнение переменных в Pascal ABC Лиза_ Паскаль, Turbo Pascal, PascalABC.NET 1 08.05.2011 22:24
Чтение файла построчно aciiiD Компоненты Delphi 11 26.08.2009 16:36