Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
1

Вывод данных из типизированного файла

07.03.2015, 19:22. Просмотров 1439. Ответов 21
Метки нет (Все метки)

Здравствуйте! У меня такой вопрос.
Имеется типизированный файл след. стр-ры:
Delphi
1
2
3
4
5
6
Data = record
         FIO:string[17];
         Group:string[8];
         Discipline:string[20];
         Mark:string[1];
f:file of Data;
При попытке организовать вывод из файла на экран оказывается, что он не разделяет корректно слова.
файл такойсодержимое)
Код
Иванов И.И.      ФМ-1-02 Высшая математика   4
Петров П.П.      ФМ-1-02 Высшая математика   3
Сидоров С.С.     ФМ-2-02 Физика              3
Иванов И.И.      ФМ-1-02 Физика              5
Петров П.П.      ФМ-1-02 Физика              4
Иванов И.И.      ФМ-1-02 Информатика         4
Сидоров С.С.     ФМ-2-02 Информатика         5
Кузнецов К.К.    ФМ-2-02 Физика              3
Петров П.П.      ФМ-1-02 Философия           4
Кацман К.К.      ФМ-3-02 Философия           5
Долго по-разному пытался - толку ноль.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.03.2015, 19:22
Ответы с готовыми решениями:

Вывод из типизированного файла
Пусть дан файл целых чисел. Нужно вывести все элементы в Edit1.Text файл...

Вывод типизированного файла в таблицу stringgrid
Здравствуйте! у меня такой вопрос , имеется типизированный файл след структуру:...

Сортировка данных типизированного файла
здравствуй... хотелось бы узнать как осуществить событие.. выбор даты...и...

Импорт данных из типизированного файла
Здравствуйте! Писал как-то программку на консоли, теперь понадобилось сделать...

Удаление данных из типизированного файла по условию
Всем привет!Такой вопрос, мне нужно удалять данные за промежуток времени...

21
Puporev
Модератор
55074 / 42335 / 29237
Регистрация: 18.05.2008
Сообщений: 100,035
07.03.2015, 19:50 2
Цитата Сообщение от Grig95 Посмотреть сообщение
Имеется типизированный файл
Цитата Сообщение от Grig95 Посмотреть сообщение
файл такой содержимое)
Типизированный файл не может быть такого содержания, в нем нет строк, создается и читается он только программно.
0
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
14.03.2015, 00:25  [ТС] 3
Да нет, я неправильно выразился, это не типизированный файл - это файл на жестком диске с расширением *.TXT. Задача состоит, чтобы считать его как типизированный файл (типа record) и обработать его данные. Считать нужно в массив из таких же записей.
0
northener
пофигист широкого профиля
3427 / 2326 / 631
Регистрация: 15.07.2013
Сообщений: 13,779
14.03.2015, 01:08 4
Цитата Сообщение от Grig95 Посмотреть сообщение
Да нет, я неправильно выразился, это не типизированный файл - это файл на жестком диске с расширением *.TXT. Задача состоит, чтобы считать его как типизированный файл
Такая задача не решаема! Следует изменить/уточнить задачу.
Цитата Сообщение от Grig95 Посмотреть сообщение
При попытке организовать вывод из файла на экран оказывается, что он не разделяет корректно слова.
Кто он? Экран? Или Файл? Или твой код? И что значит "не разделяет корректно слова"?
Цитата Сообщение от Grig95 Посмотреть сообщение
файл такойсодержимое)
Файл нужн прикладывать к сообщению, а не выдавать своё собственное видение его содержимого.
Цитата Сообщение от Grig95 Посмотреть сообщение
Долго по-разному пытался
А привести код этих долгих и разных попыток?
0
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
14.03.2015, 20:09  [ТС] 5
Цитата Сообщение от northener Посмотреть сообщение
Такая задача не решаема! Следует изменить/уточнить задачу.
То есть Delphi не может считать никак файл с расширением *.TXT как типизированный файл?
0
Puporev
Модератор
55074 / 42335 / 29237
Регистрация: 18.05.2008
Сообщений: 100,035
14.03.2015, 20:16 6
Цитата Сообщение от Grig95 Посмотреть сообщение
файл с расширением *.TXT как типизированный файл?
Если файл создан как типизированный, то без разницы какое расширение и есть ли оно вообще. Расширение .txt совсем не говорит о том что это текстовый файл.
0
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
14.03.2015, 21:19  [ТС] 7
Цитата Сообщение от Puporev Посмотреть сообщение
Если файл создан как типизированный, то без разницы какое расширение и есть ли оно вообще. Расширение .txt совсем не говорит о том что это текстовый файл.
Не, проблема не в этом. Мне нужно считать данные из этого текстового файла и записать их в файловую переменную типизированного типа. С этим проблем нет. Проблема вот в чем:
когда я пытаюсь с помощью read или readln считать из файловой переменной что-либо и записать, скажем, в массив из переменных типа запись (то есть таких же, как и File of ...) он возвращает ошибку и говорит, что несовместимые типы. Считывал я в элементы в массива. Если то же самое сделать с TextFile и array of string - все ок.
0
Sergio Leone
2467 / 1112 / 579
Регистрация: 07.06.2014
Сообщений: 3,259
14.03.2015, 23:27 8
Цитата Сообщение от Grig95 Посмотреть сообщение
Мне нужно считать данные из этого текстового файла и записать их в файловую переменную типизированного типа.
смотри. всё просто.
у тебя файл какой? Ответ - ТЕКСТОВЫЙ.
Вот и читай его как ТЕКСТОВЫЙ. (с этим у тебя проблем нет?)
дальше.
следущий шаг.
Каждая строка содержит информацию об одной записи.
Значит нужно разобрать строку на отдельные элементы и присвоить их нужным полям твоей записи.

схематично это так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var 
   f: TextFfile;
   S : string;
   R : Data;
begin
  AssignFile(f, 'ТвойФайл.TXT');
  Reset(f);
  while   not eof(f) do begin
     ReadLn(f, S);
     R.FIO := Trim( Copy(S,1,17)); 
     R.Group := Trim( Copy(S,18,8)); 
     и т.д.
     ........
 
  end;
  CloseFile(f);
вопросы есть?
0
Verevkin
1036 / 555 / 141
Регистрация: 12.03.2015
Сообщений: 3,740
15.03.2015, 03:25 9
в принципе, можно читать, как типизированный, ибо смещения полей постоянные.
просто в структуре Data не хватает 2х байт под CL RF, которые в файле есть: он же таки текстовый.
0
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
15.03.2015, 11:42  [ТС] 10
Цитата Сообщение от Sergio Leone Посмотреть сообщение
смотри. всё просто.
у тебя файл какой? Ответ - ТЕКСТОВЫЙ.
Вот и читай его как ТЕКСТОВЫЙ. (с этим у тебя проблем нет?)
дальше.
следущий шаг.
Каждая строка содержит информацию об одной записи.
Значит нужно разобрать строку на отдельные элементы и присвоить их нужным полям твоей записи.
схематично это так:
Код Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var
* *f: TextFfile;
* *S : string;
* *R : Data;
begin
* AssignFile(f, 'ТвойФайл.TXT');
* Reset(f);
* while * not eof(f) do begin
* * *ReadLn(f, S);
* * *R.FIO := Trim( Copy(S,1,17));
* * *R.Group := Trim( Copy(S,18,8));
* * *и т.д.
* * *........
end;
* CloseFile(f);
вопросы есть?
Так это я и сам могу. Я просто хотел бы узнать, почему он выдает ошибку, когда это делаешь через file of Data (Data - record), то есть:
type
Data = record
.......
........
end;
var
f:File of Data;
Ses: array of Data;
begin
AssignFile(f, 'C:\.......');
{$I-}
reset(f);
{$I+}
if ioresult = 0 then
.......
А дальше, когда я, допустим, пытаюсь считать через: readln(f,Ses[i]) (Запускаю, разумеется в цикле) выдает
Error: Incompatable types. Мне нужно просто узнать, можно ли вообще так сделать или придется только как TExtFile а потом искусственный перевод в record, или все-таки можно как-то исхитриться и обойти эту ошибку.

Добавлено через 3 минуты
Цитата Сообщение от Verevkin Посмотреть сообщение
в принципе, можно читать, как типизированный, ибо смещения полей постоянные.
просто в структуре Data не хватает 2х байт под CL RF, которые в файле есть: он же таки текстовый.
Можно поподробней: Что это за CL RF? Переход на новую строку, что ли?
0
Verevkin
1036 / 555 / 141
Регистрация: 12.03.2015
Сообщений: 3,740
15.03.2015, 11:59 11
Цитата Сообщение от Grig95 Посмотреть сообщение
Можно поподробней: Что это за CL RF? Переход на новую строку, что ли?
ну да.
Цитата Сообщение от Grig95 Посмотреть сообщение
readln(f,Ses[i]) (Запускаю, разумеется в цикле) выдает
Error: Incompatable types.
процедура readln – только для текстовых файлов.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var 
  F: TextFile;
  S: string;
begin
  if OpenDialog1.Execute then            { Display Open dialog box }
  begin
    AssignFile(F, OpenDialog1.FileName); { File selected in dialog }
    Reset(F);
    Readln(F, S);                        { Read first line of file }
    Edit1.Text := S;                     { Put string in a TEdit control }
    CloseFile(F);
  end;
end;
з.ы. я устал кричать уже: хватит юзать эти паскалевские рудименты! для бинарников есть потомки TStream, а для текстовых – потомки TStrings! один раз изучить на практике, потом юзать долгие годы – удобно, быстро, красиво, надёжно. и не будет таких непоняток, как с readln.
0
Sergio Leone
2467 / 1112 / 579
Регистрация: 07.06.2014
Сообщений: 3,259
15.03.2015, 12:02 12
Цитата Сообщение от Grig95 Посмотреть сообщение
А дальше, когда я, допустим, пытаюсь считать через: readln(f,Ses[i]) (Запускаю, разумеется в цикле) выдает
Error: Incompatable types. Мне нужно просто узнать, можно ли вообще так сделать
Угу. Так делать можно ТОЛЬКО ЕСЛИ файл реально имеет структуру file of Data; (ну, только надо делать Read(f, ses[ i ]), как выше абсолютно верно сказано, Readln - только исключительно для текстовых файлов!)
с вашим текстовым файлом так делать НЕЛЬЗЯ.

Цитата Сообщение от Grig95 Посмотреть сообщение
Можно поподробней: Что это за CL RF? Переход на новую строку, что ли?
не рекомендую пытаться такое сделать. это очень-очень не надёжно.достаточно где-нибудь один лишний пробел вставить или удалить, как весь этот карточный домик рухнет напрочь!



Добавлено через 1 минуту
Цитата Сообщение от Verevkin Посмотреть сообщение
з.ы. я устал кричать уже: хватит юзать эти паскалевские рудименты! для бинарников есть потомки TStream, а для текстовых – потомки TStrings! один раз изучить на практике, потом юзать долгие годы – удобно, быстро, красиво, надёжно. и не будет таких непоняток, как с readln.
к сожалению, часто бывают учебные задания. Вот, например, взять автора темы - думаешь он сам про типизированный файл придумал? Не, думаю, что ему такое задание дали.
А в остальном я с тобой согласен!
0
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
15.03.2015, 12:08  [ТС] 13
Цитата Сообщение от Verevkin Посмотреть сообщение
процедура readln – только для текстовых файлов.
А как тогда? Через eof тоже пробовал. Правда там косяк другого рода получается (While not(eof(f)) имеешь ввиду? Там, разумеется, read.)

Добавлено через 2 минуты
Цитата Сообщение от Sergio Leone Посмотреть сообщение
Угу. Так делать можно ТОЛЬКО ЕСЛИ файл реально имеет структуру file of Data; (ну, только надо делать Read(f, ses[ i ]), как выше абсолютно верно сказано, Readln - только исключительно для текстовых файлов!)
с вашим текстовым файлом так делать НЕЛЬЗЯ.
То есть при моих данных через file of Data точно сделать не получиться?
0
Verevkin
1036 / 555 / 141
Регистрация: 12.03.2015
Сообщений: 3,740
15.03.2015, 12:10 14
Цитата Сообщение от Sergio Leone Посмотреть сообщение
думаешь он сам про типизированный файл придумал?
пусть файл типизированный, ввод/вывод даже в этом случае можно (нужно!) организовать без паскалевских файловых функций.
0
Sergio Leone
2467 / 1112 / 579
Регистрация: 07.06.2014
Сообщений: 3,259
15.03.2015, 12:19 15
Цитата Сообщение от Grig95 Посмотреть сообщение
То есть при моих данных через file of Data точно сделать не получиться?
если Вы сами не создадите нужный ТИПИЗИРОВАННЫЙ файл, то с вашим текстовым файлом - нет, НЕ ПОЛУЧИТСЯ.

интересно, сколько раз ещё надо повторить, что текстовый файл и типизированный - это разные типы файлов и по разному из них идёт чтение и запись?!
0
Verevkin
1036 / 555 / 141
Регистрация: 12.03.2015
Сообщений: 3,740
15.03.2015, 12:19 16
Цитата Сообщение от Grig95 Посмотреть сообщение
То есть при моих данных через file of Data точно сделать не получиться?
теоретически – можно: смотри пост #9 (подогнать размер рекорда под длину строки, +2 байта). но крайне не рекомендую так делать.

где ты взял входной файл? сам набрал? почему строки дозаполнены пробелами, а не мусором?
0
Sergio Leone
2467 / 1112 / 579
Регистрация: 07.06.2014
Сообщений: 3,259
15.03.2015, 12:24 17
Цитата Сообщение от Verevkin Посмотреть сообщение
можно (нужно!) организовать без паскалевских файловых функций.
это ещё почему?
Вот на паскале чтение ПОСЛЕДНЕЙ записи:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
var f : file of DATA;
  One : DATA;
begin
  Assign(F, 'File.dat');
  Reset(f);
  if FileSize(f)=0 then WriteLn('В файл нет записей')
  else begin
    Seek(f, FileSize(f)-1);
    Read(f, One)
    WriteLn('Прочитана предпоследния запись. FIO = ', One.FIO, 'Group = ', One.Group);
  end;
  Close(f);
end.
неужели это же сделать БЕЗ использования паскалевских функций будет ПРОЩЕ?
0
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
15.03.2015, 12:32  [ТС] 18
Цитата Сообщение от Verevkin Посмотреть сообщение
теоретически – можно: смотри пост #9 (подогнать размер рекорда под длину строки, +2 байта). но крайне не рекомендую так делать.
Два байта указывать в последнем поле записи, нет?
Почему не рекомендуешь? Имеешь в виду, если добавить какой-нибудь лишний мусор, все рухнет?
Кстати, а если не *.TXT, а, скажем, *.DAT? Тот же результат?
Цитата Сообщение от Verevkin Посмотреть сообщение
где ты взял входной файл? сам набрал? почему строки дозаполнены пробелами, а не мусором?
Входной файл был приложен к заданию.
0
Verevkin
1036 / 555 / 141
Регистрация: 12.03.2015
Сообщений: 3,740
15.03.2015, 12:39 19
Цитата Сообщение от Sergio Leone Посмотреть сообщение
неужели это же сделать БЕЗ использования паскалевских функций будет ПРОЩЕ?
а ты попробуй через стрим. а я дополню.
тебе понравится, ТС-у, надеюсь, тоже. таким образом мы сделаем доброе дело – вылечим хотя бы одного инфицированного (его старый препод укусил вставными челюстями и заразил).

Добавлено через 6 минут
Цитата Сообщение от Grig95 Посмотреть сообщение
Два байта указывать в последнем поле записи, нет?
да.
Цитата Сообщение от Grig95 Посмотреть сообщение
Почему не рекомендуешь? Имеешь в виду, если добавить какой-нибудь лишний мусор, все рухнет?
нет. просто в данном случае это один большой костыль. забудь.
Цитата Сообщение от Grig95 Посмотреть сообщение
Кстати, а если не *.TXT, а, скажем, *.DAT? Тот же результат?
мдяяяя... рановато тебе ещё программированием заниматься.
Цитата Сообщение от Grig95 Посмотреть сообщение
Входной файл был приложен к заданию.
а на каком носителе было задание и приложенный файл?
0
Grig95
0 / 0 / 0
Регистрация: 07.03.2015
Сообщений: 9
15.03.2015, 12:51  [ТС] 20
Цитата Сообщение от Sergio Leone Посмотреть сообщение
если Вы сами не создадите нужный ТИПИЗИРОВАННЫЙ файл, то с вашим текстовым файлом - нет, НЕ ПОЛУЧИТСЯ.
А как это сделать?
0
15.03.2015, 12:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2015, 12:51

Не работает отображение искомых данных из типизированного файла в StringGrid
Народ, нужна помощь, очень СРОЧНО.. Создал систему поиска данных из...

Разбор типизированного файла
Имеется типизированный файл... нужно узнать его структуру а после прочитать...

Редактирование типизированного файла
Доброго времени суток! Прощу помощи с решением моей проблемы. Вот формулировка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru