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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2012, 18:05   #1
Joyker
 
Регистрация: 22.12.2011
Сообщений: 5
По умолчанию Все те же текстовые файлы..

Подскажите что не так, а точнее как это исправить.

Задача : создать структуру (запись) информации о студентах (фио, пол, дата рождение, факультет, специальность, средняя оценка), записать в текстовый файл, затем считать из файла и вывести на экран всех студентов женского пола, средняя оценка которых выше введенной с клавиатуры.

Некоторые материалы читал но особо сильно не помогло.


Код:
program lab_record;
uses crt;
type
anketa=record
 fio:string;
 bd:string;
 pol:string;
 fac:string;
 spec:string;
 av:string;
end;
var
 s: array[1..15] of anketa;
 i:integer;
 set_av:string;
 f2,f1:text;
 fio,bd,fac,spec:string;
 pol:string;
 av:string;
BEGIN
assign(f1,'file2.txt');
rewrite(f1);
for i:=1 to 2 do
  begin
    Writeln(' ');
    Writeln('Input data about student ',i);
    Writeln('Input FIO');
    readln(s[i].fio);
   Writeln('Input day of birthday');
    Readln(s[i].bd);
    Writeln('Input Male or Female');
    readln(s[i].pol);
    Writeln('Input student`s faculty');
    readln(s[i].fac);
    Writeln('Input student`s speciality');
    readln(s[i].spec);
    Writeln('Input student`s avrage mark');
    readln(s[i].av);
    writeln(' ');
    {Writeln(f1,s[i].fio,'  ',s[i].bd,'  ',s[i].pol,'  ',s[i].fac,'  ',s[i].spec,'  ',s[i].av);}
  end;
writeln(' ');
Write('Input avrage mark ');
readln(set_av);
writeln('');
writeln('FIO  | ','Birthday  | ','Pol  | ','Faculty  | ','Speciality  | ','Avrage mark');
close(f1);
assign(f2,'file2.txt');
reset(f2);
for i:=1 to 2 do
 begin
     readln(f2,fio,bd,pol,fac,spec,av);
     {writeln(fio,'  ',pol);}
      if pol='f'  then
       if  av>set_av then
        writeln(fio,'  ',bd,'  ',pol,'  ',fac,'  ',spec,'  ',av);

 end;
readln;
close(f2);
end.
Все что закоментированно вводил для проверки, запись нормально создается и пишется в файл, а вот с чтением...
Убрав скобки в {writeln(fio,' ',pol);} получаю всегда правильный ответ, независимо от содержания (на экран выводятся все студенты). Эксперимента ради даже один файл на 2 переменные назначил, не помогло.

Поставив Watch заметил, что все содержимое строки копируется в переменную fio, почему ? и главное как это исправить ?

P.S ранее делал разные типы, пол был char, av: byte и тд, но только поставив все string-ом получил ну хоть какой-то результат.

Заранее спасибо за помощь!
Joyker вне форума Ответить с цитированием
Старый 11.02.2012, 19:05   #2
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

readln - считывание всей строки... или же 255 символов строки... либо делай через read, либо каждое данное для чтение помещай на разных строках... тобишь фио ентрер ДР ентре и т.д.
P.S. в объявлении ещё поставь длинну строковых переменных.... если будешь делать через read...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 11.02.2012, 19:47   #3
Joyker
 
Регистрация: 22.12.2011
Сообщений: 5
По умолчанию

Цитата:
Сообщение от VIK_aka_TOR Посмотреть сообщение
readln - считывание всей строки... или же 255 символов строки... либо делай через read, либо каждое данное для чтение помещай на разных строках... тобишь фио ентрер ДР ентре и т.д.
P.S. в объявлении ещё поставь длинну строковых переменных.... если будешь делать через read...
Заменил на read (имелось ввиду считать по 1 значению ?) не помогло, поставив ограничение везде по 10 символов категорически ничего не изменилось. Несмотря на пробелы в текстовом файле 10 символов (считая пробелы) идут в переменную fio, и т.д...
Я ж заранее не знаю сколько и где будет символов.

Про 1 значение на 1 строку была мысль, не понравилась, но работает.

Спортивный интерес был что б красиво все в 1 строчке сделать, что б 1 студент = 1 строка.

Мне казалось что чтение значения идет до разделителя (коим вроде как есть пробел), разве не так ? (сведения откуда-то из интернета, уже не помню и откуда)

Окончательный код:

Код:
program lab_record;
uses crt;
type
anketa=record
 fio:string;
 bd:string;
 pol:string;
 fac:string;
 spec:string;
 av:string;
end;
var
 s: array[1..15] of anketa;
 i:integer;
 set_av:string;
 f1:text;
 fio,bd,fac,spec:string;
 pol:string;
 av:string;
BEGIN
assign(f1,'file2.txt');
rewrite(f1);
for i:=1 to 2 do
  begin
    Writeln(' ');
    Writeln('Input data about student ',i);

    Writeln('Input FIO');
    readln(s[i].fio);
    writeln(f1,s[i].fio);

    Writeln('Input day of birthday');
    readln(s[i].bd);
    writeln(f1,s[i].bd);

    Writeln('Input Male or Female');
    readln(s[i].pol);
    writeln(f1,s[i].pol);


    Writeln('Input student`s faculty');
    readln(s[i].fac);
    writeln(f1,s[i].fac);


    Writeln('Input student`s speciality');
    readln(s[i].spec);
    writeln(f1,s[i].spec);



    Writeln('Input student`s avrage mark');
    readln(s[i].av);
    writeln(f1,s[i].av);

    writeln(f1);

    writeln(' ');
      end;

Write('Input avrage mark ');
readln(set_av);
writeln('');
reset(f1);
for i:=1 to 2 do
  begin
     readln(f1,fio);
     readln(f1,bd);
     readln(f1,pol);
     readln(f1,fac);
     readln(f1,spec);
     readln(f1,av);
     readln(f1);
      if pol='f'  then
       if  av>set_av then
        writeln(fio,'  ',bd,'  ',pol,'  ',fac,'  ',spec,'  ',av);
  end;
readln;
close(f1);
end.
З.Ы спасибо за ответ

Последний раз редактировалось Joyker; 11.02.2012 в 19:54. Причина: подправил по мелочам
Joyker вне форума Ответить с цитированием
Старый 11.02.2012, 20:34   #4
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

впринципе можно и по пробелу намутить... считывать все в одну строку сразу... и затем по символьно проверять на пробелы... и добавлять в нужные переменные...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 11.02.2012, 20:54   #5
Joyker
 
Регистрация: 22.12.2011
Сообщений: 5
По умолчанию

идея теоретически рабочая, только я понятия не имею как это сделать) даже примерно
Joyker вне форума Ответить с цитированием
Старый 11.02.2012, 21:03   #6
VIK_aka_TOR
Участник клуба
 
Аватар для VIK_aka_TOR
 
Регистрация: 30.01.2011
Сообщений: 1,578
По умолчанию

теоритически?.... да ладно... она рабочая... ).. просто гемору чуток больше...
можно переделать и установив ограничения на кое какие поля... тобишь выставить в записи длинну некоторых стрингов, если используешь тип записи, то записывать можно в типизированный файл, тие самым потом упростить себе путь при считывании... выставив теже ограничения длинны на ввод фамилии и иных текстовых переменных...
собственно... если вас это устраивает то можно так и оставить...
пишу код не только за печеньки
VIK_aka_TOR вне форума Ответить с цитированием
Старый 11.02.2012, 21:17   #7
Joyker
 
Регистрация: 22.12.2011
Сообщений: 5
По умолчанию

Это устраивает, никаких ограничений мне не ставили, лишь бы в файл писало и с него читалось, да с использованием записи.

Когда время появится - вернусь к этому, поколдую, может и получится чего)

В любом случае, спасибо за помощь!
Joyker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текстовые файлы и Turbo Pascal: Напечатать все слова, которые встречаются в заданной последовательности по одному разу Katonka Помощь студентам 0 17.06.2011 01:51
Текстовые файлы Mors13 Помощь студентам 1 19.05.2011 16:29
Текстовые файлы Evacuator Помощь студентам 1 19.12.2010 14:56