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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2009, 19:33   #1
RgnRok
Пользователь
 
Аватар для RgnRok
 
Регистрация: 13.01.2009
Сообщений: 19
По умолчанию Чтение из файла, нужна помощь

Добрый вечер уважаемые форумчане.
Возникла проблема при чтении даных из текстового файла.
файл имеет такую структуру:

Аношенко Г. 40 40 40
Ракаускайте К. 30 33 33
Терентьев М. 31 34 35
Хардин К. 50 50 50
Юрасова Г. 40 50 45
Лебедев С. 50 46 45

где сперва идет фамилия с инициалами, а после 3 оценки по 3-м модулям.
данные файла необходимо записывать в строку.
Пример части данной програы написан ниже, вродебы все должно работать но не хочет( надеюсь на ваше понимание и помощь
program exe;
type yy=record
surname:string;
NameLetter:string;
bal1:integer;
bal2:integer;
bal3:integer;
end;
var
a:array [1..6] of yy;
f:text;
i:integer;
begin
assign (f,'C:\pascal\bin\a.txt');
reset(f);
i:=1;
while not eof(f) do
begin
readln(f,a[i]., a[i].NameLetter, a[i].bal1, a[i].bal2, a[i].bal3);

i:=i+1;
end;
close(f);
end.

Последний раз редактировалось RgnRok; 13.01.2009 в 19:45.
RgnRok вне форума Ответить с цитированием
Старый 13.01.2009, 19:38   #2
Hollander
Участник клуба
 
Аватар для Hollander
 
Регистрация: 03.05.2007
Сообщений: 1,189
По умолчанию

Смотри, ты пишешь:
Код:
readln(f,a[i].surname,a[i].bal);
Т.е. читаешь из файла f строку и bal(которого вообще у тебя нету).
надо так
Код:
readln(f,a[i].surname, a[i].NameLetter, a[i].bal1, a[i].bal2, a[i].bal3);
И не забудь добавить NameLetter в свою структуру. Вроде так.
Hollander вне форума Ответить с цитированием
Старый 13.01.2009, 19:43   #3
RgnRok
Пользователь
 
Аватар для RgnRok
 
Регистрация: 13.01.2009
Сообщений: 19
По умолчанию

ой это я случайно описался сдесь) в программе написано имеено так как ты написал выше. На стадии компилятора все отлично проходит, а вот при запуске нет пишет "недопустимый числовой формат"
RgnRok вне форума Ответить с цитированием
Старый 13.01.2009, 22:19   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

просто так не получится читать!
Обязательно нужно читать строчку из файла в строковую переменную, а дальше выделять нужные куски через Pos() и Copy()...
пишу так, приблизительно:
Код:
var
  s : string;
  k : integer;
...
i :=0 ;
while not eof(f) do
begin
  readln(f,s);
  if Pos('.',s)>3 then begin
      i := i + 1;
      a[i].surname := Copy(s,1,Pos('.',s)-3);
      a[i].NameLetter := Copy(s,Pos('.',s)-2,2);
      Delete(s,1,Pos('.',s));
      Val(Copy(s,1,Pos(' ',s)-1,a[i].bal1,k);
      Delete(s,1,Pos(' ',s));
      Val(Copy(s,1,Pos(' ',s)-1,a[i].bal2,k);
      Delete(s,1,Pos(' ',s));
      Val(s,a[i].bal3,k);
   end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.01.2009, 23:10   #5
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

Все верно, только при чтении из файла всегда надо проверять на наличие ошибки - как при чтении файла , так и у функции вал второй параметр
capta1n вне форума Ответить с цитированием
Старый 13.01.2009, 23:26   #6
RgnRok
Пользователь
 
Аватар для RgnRok
 
Регистрация: 13.01.2009
Сообщений: 19
По умолчанию

[QUOTE=Serge_Bliznykov;186119]просто так не получится читать!
Обязательно нужно читать строчку из файла в строковую переменную, а дальше выделять нужные куски через Pos() и Copy()...
QUOTE]

Можете пожалуйсто в кратци пояснить почему именно не получится считывать начальным методом. Чтобы я смог понять
RgnRok вне форума Ответить с цитированием
Старый 14.01.2009, 00:48   #7
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

потому что компьютер cтрог в понимании - он не может понять человека, он может выполнять строго определенные функции, определенные языковым синтаксисом - когда вы читаете с консоли, тобишь экран+клавиатура, в терминале, тогда вы можете задавать сколь угодно вводимых значений, потому что тогда компьютер понимает, сколько ему нужно принять данных, введенных пользователем, ибо пользователь вводит их сам, а когда вы читаете из файла, компьютер не может понять, что считать за первую переменную, и допустим, сколько ей выделять символов в строке, а сколь выделять на вторую - он понимает только определенное чтение одной компоненты файла, коеми являются строки, а более мелкими (элементарными) компонентами текстового файла являются символы - вот отталкиваясь от этого компьютер и производит чтение из файла - конечно, когда вы читаете допустим в переменную перечисляемого типа ( целого, вещественного ) файл делает замену из символа в число ( если читаемый символ строко числовой ) - он делает преобразования - как только символ не совпадает с типом переменно, в которую читают, происходит ошибка ввода, проверяемая функцией IOResult <> 0 - при отключенной директиве {$-} - надеюсь все понятно
capta1n вне форума Ответить с цитированием
Старый 14.01.2009, 02:06   #8
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

to capta1n

хмм... вроде, как я понял, структура входного файла определена заранее, и отхождения от неё не должно быть... так что здесь ваше замечание как-то неуместно... хотя, конечно, очень ценное
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Старый 14.01.2009, 04:44   #9
capta1n
Форумчанин
 
Аватар для capta1n
 
Регистрация: 06.12.2008
Сообщений: 613
По умолчанию

оно уместно, если человек просит объяснить, почему его вводом пользоваться нельзя
capta1n вне форума Ответить с цитированием
Старый 14.01.2009, 09:23   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

прогоните вот эту программку. может Вам станет чуть понятнее...
Код:
var
  f : text;
  s : array[1..10] of string;
  i : integer;
begin
  Assign(f,'test1.txt');
  Reset(f);
  Readln(f,s[1],s[2],s[3],s[4],s[5]);
  for i:=1 to 5 do
    WriteLn(i:1,s[i]);
  Close(f)
end.
т.к. размер строки s не задан, то Read(f,s) прочитает столько, сколько сможет (т.е. в нашем случае всё до конца строки). Если бы текст был структурированным, например, под фамилию и отчество - в текстом файле РОВНО nn символов. тогда строку определяем как s : string[nn]; и тогда прочитается из файла ровно nn знаков..

capta1n, я бы просто хотел обратить Ваше внимание на тот факт, что Вы неправы насчёт того, что с консоли это будет читаться как то по другому, не так, как из файла - хоть с консоли (ввод оператора), хоть из текстового файла - правила обработки входных данных будут одни и те же!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужна помощь с добавлением файла 777UFO777 Общие вопросы Delphi 3 26.12.2008 12:01
чтение из файла Илья500 Общие вопросы C/C++ 26 05.12.2008 00:37
Чтение файла [Smarik] Помощь студентам 8 28.04.2008 22:15
чтение файла vicvtor Общие вопросы Delphi 4 27.11.2006 12:26