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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2012, 23:19   #1
Van-89
Пользователь
 
Регистрация: 06.12.2011
Сообщений: 23
Вопрос Считывание текста из файла

Допустив в файле 100 слов... нужно каждое слово внести в переменную и после его надо будет обработать...

В общем проблема в том что целые строки берёт в одну переменную а надо только одно слово...
С цифрами проблем нету но вот с текстом проблема... помогите плиз)

Код:
VAR mass: array[1..100] of integer; i: integer;

    f1, f2: text;

Begin

Assign(f1, 'c:\book.txt');
Reset(f1);

For i:=1 to 100 do Read(f1, mass[i]);

Write(mass[2]);

Close(f1);
End.
Van-89 вне форума Ответить с цитированием
Старый 17.04.2012, 23:20   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

а в чём проблема читайте строку и разбивайте её на слова
с помошью copy и delete
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 18.04.2012, 07:15   #3
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
а в чём проблема читайте строку и разбивайте её на слова
с помошью copy и delete
пример на паскале
Код:

uses crt;
type
Tpoint=record
 x,y:integer;
end;

var
  WordEnd:array[1..60] of char;
  
Procedure init; // задаем массив знаков разделителей
begin
     WordEnd[1]:='’';WordEnd[2]:='[';WordEnd[3]:=']';WordEnd[4]:='(';WordEnd[5]:=')';
     WordEnd[6]:='{';WordEnd[7]:='}';WordEnd[8]:=':';WordEnd[9]:=',';WordEnd[10]:='–';
     WordEnd[11]:='—';WordEnd[12]:='…';WordEnd[13]:='!';WordEnd[14]:='.';WordEnd[15]:='-';
     WordEnd[16]:='‘';WordEnd[17]:='’';WordEnd[18]:='“';WordEnd[19]:='”';WordEnd[20]:='«';
     WordEnd[21]:='»';WordEnd[22]:=#39;WordEnd[23]:=';';WordEnd[24]:='/';WordEnd[25]:='/';
     WordEnd[26]:=' ';WordEnd[27]:='·';WordEnd[28]:='&';WordEnd[29]:='@';WordEnd[30]:='*';
     WordEnd[31]:='\';WordEnd[32]:='•';WordEnd[33]:='^';WordEnd[34]:='©';WordEnd[35]:='¤';
     WordEnd[36]:='†';WordEnd[37]:='‡';WordEnd[38]:='°';WordEnd[39]:='#';WordEnd[40]:='№';
     WordEnd[41]:='%';WordEnd[42]:='‰';WordEnd[43]:='¶';WordEnd[44]:='®';WordEnd[45]:='§';
     WordEnd[46]:='~';WordEnd[47]:='™';WordEnd[48]:='_';WordEnd[49]:='|';WordEnd[50]:='¦';
     WordEnd[51]:='0';WordEnd[52]:='1';WordEnd[53]:='2';WordEnd[54]:='3';WordEnd[55]:='4';
     WordEnd[56]:='5';WordEnd[57]:='6';WordEnd[58]:='7';WordEnd[59]:='8';WordEnd[60]:='9';
 end;

Function SimvolBreakWord(s:char):boolean; // Символ s:char - является знаком припенания?
var x:integer;
begin
result:=false;
   for x:=1 to 60 do
     if s=WordEnd[x] then begin result:=true; exit; end;
end;


Function GetWordCount(s:string;len:integer):integer;
 var y,x:integer;
    s2:string;
begin
  y:=0;
  s2:='';
  result:=0;
  for X:=1 to length(s) do begin
    if (ord(s[x])<33) or (SimvolBreakWord(s[x])) or (x=length(s)) then
                       begin
                       if (s2<>'') and ((len=0) or (length(s2)>=len)) then begin
                             y:=y+1;
                             end;
                             s2:='';
                          end else s2:=s2+s[x];
  end;
  result:=y;
end;
// вернуть позицию слова номер index из строки s
Function GetPosIndex(s:string;index:integer;len:integer):Tpoint;
var y,x:integer;
    s2:string;
begin
  y:=0;
  s2:='';
  result.X:=1;
  result.y:=0;
  for X:=1 to length(s) do begin
if (ord(s[x])<33) or (SimvolBreakWord(s[x])) or (x=length(s)) then
                       begin
                       if not ((SimvolBreakWord(s[x])) or (ord(s[x])<33)) then s2:=s2+s[x];
                       if (s2<>'') and ((len=0) or (length(s2)>=len))  then begin
                             y:=y+1;
                             if y=index then begin
                               result.y:=length(s2);
                               exit;
                             end
                             end;
                             s2:='';
                          end
                          else begin
                          if s2='' then result.X:=x; // запоминаем позицию начала слова
                          s2:=s2+s[x]; // копируем слово

                          end;


  end;

end;

// получить слово номер
Function GetSlovoIndex(s:string;index:integer;len:integer):string;
var pr:Tpoint;
begin
    pr:=GetPosIndex(s,index,len);
    if pr.X>0 then
    if pr.y>0 then result:=copy(s,pr.x,pr.y);

end;

var wCount:integer; // кол-во слов
    stexT:string; // текст
    x:Integer;
begin
  clrscr;
  init; // инициализация массива разделителей
  stexT:='cортировка методом bubbles (пузырьков)';
  wCount:=GetWordCount(stexT,0); // получаем кол-во слов в тексте stexT
  Writeln('Кол-во слов в тексте "'+stext+'" ', WCount);
  
  Writeln('Номер; Слово');
  for x:=1 to wCount do
  Writeln(X:4,';  "',GetSlovoIndex(stexT,x,0)+'"');

end.
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 18.04.2012, 08:08   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от denisbrain
Код:
var
  WordEnd:array[1..60] of char;
  
Procedure init; // задаем массив знаков разделителей
begin
     WordEnd[1]:='’';WordEnd[2]:='[';WordEnd[3]:=']';WordEnd[4]:='(';WordEnd[5]:=')';
     WordEnd[6]:='{';WordEnd[7]:='}';WordEnd[8]:=':';WordEnd[9]:=',';WordEnd[10]:='–';
     WordEnd[11]:='—';WordEnd[12]:='…';WordEnd[13]:='!';WordEnd[14]:='.';WordEnd[15]:='-';
     WordEnd[16]:='‘';WordEnd[17]:='’';WordEnd[18]:='“';WordEnd[19]:='”';WordEnd[20]:='«';
     WordEnd[21]:='»';WordEnd[22]:=#39;WordEnd[23]:=';';WordEnd[24]:='/';WordEnd[25]:='/';
     WordEnd[26]:=' ';WordEnd[27]:='·';WordEnd[28]:='&';WordEnd[29]:='@';WordEnd[30]:='*';
     WordEnd[31]:='\';WordEnd[32]:='•';WordEnd[33]:='^';WordEnd[34]:='©';WordEnd[35]:='¤';
     WordEnd[36]:='†';WordEnd[37]:='‡';WordEnd[38]:='°';WordEnd[39]:='#';WordEnd[40]:='№';
     WordEnd[41]:='%';WordEnd[42]:='‰';WordEnd[43]:='¶';WordEnd[44]:='®';WordEnd[45]:='§';
     WordEnd[46]:='~';WordEnd[47]:='™';WordEnd[48]:='_';WordEnd[49]:='|';WordEnd[50]:='¦';
     WordEnd[51]:='0';WordEnd[52]:='1';WordEnd[53]:='2';WordEnd[54]:='3';WordEnd[55]:='4';
     WordEnd[56]:='5';WordEnd[57]:='6';WordEnd[58]:='7';WordEnd[59]:='8';WordEnd[60]:='9';
 end;
Денис, во-первых, строго говоря, то этот код не совсем на Паскале (на ТурбоПаскале, например, КАТЕГОРИЧЕСКИ не пойдёт...)

во-вторых, что же Вам так этот безумный набор разделителей понравился то?!
тогда уже проще описать МНОЖЕСТО ДОПУСТИМЫХ символов и любой символ, который не входит в данное множесто - значит разделитель:
Код:
  
  for i:=1 to Length(s) do
     if s[i] in ['a'..'z','A'..'Z', 'А'..'Я','а'..'п','р'..'я' ] then - БУКВА
     else НЕ БУКВА (по-вашему мнению, значит, разделитель!)
хотя для 99.9% учебных (да и не только учебных задач) вполне достаточно считать, что разделителями слов являются символы
Код:
  WordDelimiters : set of char = [' ',',','.','-','!','?',':',';',')','(','[',']'];
ну и последнее, вот, например, функция из модуля TPSTRING.PAS 5.05 (с) Copyright (c) TurboPower Software 1987. (библиотека Turbo Professional)
для подсчёта количества слов в строке:
Код:
  function WordCount(S : string; WordDelims : CharSet) : Byte;
    {-Given a set of word delimiters, return number of words in S}
  var
    Count : Byte;         
    I : Word;                
    SLen : Byte;
  begin
    SLen := Length(S); 
    Count := 0;
    I := 1;

    while I <= SLen do begin
      {skip over delimiters}
      while (I <= SLen) and (S[I] in WordDelims) do
        Inc(I);

      {if we're not beyond end of S, we're at the start of a word}
      if I <= SLen then
        Inc(Count);

      {find the end of the current word}
      while (I <= SLen) and not(S[I] in WordDelims) do
        Inc(I);
    end;

    WordCount := Count;
  end;

BTW, забавно, а чем у Вас константа WordEnd[1] отличается от WordEnd[17] ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2012, 08:29   #5
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Денис, во-первых, строго ?![/I]



Код:
bkend:=[#146,#91,#93,#40,#41,#123,#125,#58,#44,#150,#151,#133,#33,
                      #46,#45,#145,#146,#147,#148,#171,#187,#39,#59,#47,#47,#32,
                      #183,#38,#64,#42,#92,#149,#94,#169,#164,#134,#135,#176,
                      #35,#185,#37,#137,#182,#174,#167,#126,#153,#95,#124,#166,'0','1','2','3','4','5','6','7','8','9'];

endWord  = set of  #0..#255;
bkend:endWord;
список символов сам делал из Wiki пишу свой модуль разделения на слова. тестируем находим ошибки исправляем...
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 18.04.2012, 08:45   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Денис, Вы не читаете того, что я Вам пишу?!

во-первых, зачем ТАК МНОГО РАЗДЕЛИТЕЛЕЙ?!
во-вторых,
Цитата:
Код:
endWord  = set of  #0..#255;
bkend:endWord;
Это не нужно совсем! А в такой последовательности, как Вы написали, вообще некомпилированный абсурд. Константы в подобных случаях намного удобнее использовать.

в-третьих, ВАЖНО! Ваш код КОДОЗАВИСИМЫЙ!
Это коды символов ИСКЛЮЧИТЕЛЬНО для кодировки Windows (ANSI, Windows 1251), в другой кодировке это будет полный бред!
Например, Ваш код в TurboPascal (кодировка символов DOS (она же 866, она же OEM) будет считать разделителями слов следущиющие символы:
Код:
Turbo Pascal  Version 7.0  Copyright (c) 1983,92 Borland International
#133:Е
#134:Ж
#135:З
#137:Й
#145:С
#146:Т
#147:У
#148:Ф
#149:Х
#150:Ц
#151:Ч
#153:Щ
#164:д
#166:ж
#167:з
#169:й
#171:л
#174:о
ещё вопросы есть?!


p.s.
Цитата:
Код:
bkend:=[#146,#91,#93,#40,#41,#123,#125,#58,#44,#150,#151,#133,#33,
                      #46,#45,#145,#146,#147,#148,#171,#187,#39,#59,#47,#47,#32,
символы с кодами #146 и #47 повторяются для надёжности, как я понимаю?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2012, 10:04   #7
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Денис, Вы не читаете того, что я Вам пишу?!
wiki
http://ru.wikipedia.org/wiki/%C7%ED%...ED%E0%ED%E8%FF

т.е. для дос кодировки

#32,#33,#35,#37,#38,#39,#40,#41,#42 ,#44,#45,#46,#47,#48,#49,#50,#51,#5 2, #53,#54,#55,#56,#57,#58,#59,#64,#91 ,#92,#93,#94,#95,#123,#124,#125,#12 6, #58,#197,#216,#37,#39,#39,#34,#34,# 7,#45,#45,#84,#253,#179,#21,#99,#60 ,#82,#248,#20,#250,#252,#62
такой набор символов?
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 18.04.2012, 11:16   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от denisbrain Посмотреть сообщение
wiki
http://ru.wikipedia.org/wiki/%C7%ED%...ED%E0%ED%E8%FF

т.е. для дос кодировки

#32,#33,#35,#37,#38,#39,#40,#41,#42 ,#44,#45,#46,#47,#48,#49,#50,#51,#5 2, #53,#54,#55,#56,#57,#58,#59,#64,#91 ,#92,#93,#94,#95,#123,#124,#125,#12 6, #58,#197,#216,#37,#39,#39,#34,#34,# 7,#45,#45,#84,#253,#179,#21,#99,#60 ,#82,#248,#20,#250,#252,#62
такой набор символов?
Денис, Вы что, издеваетесь?

во-первых, НЕТ! в данный набора вы даже латиницу включили (а она уж в любой кодировке на одном и том же месте).
Цитата:
Код:
Turbo Pascal  Version 7.0  Copyright (c) 1983,92 Borland International
#82:R
#84:T
#99:c
во-вторых, уходите Вы от кодов! НЕ НУЖНЫ они Вам! Совсем!!! по крайней мере с кодами больше $7F


в-третьих, я ТРЕТИЙ раз спрашиваю, ЗАЧЕМ Вы включаете в набор ОДНИ и те же коды МНОГОКРАТНО?!!

Например, код #45 Вы включили сейчас ТРИ раза, #37 и #37 по два раза и т.д. Отсортируйте код по возрастанию значений (если уж Вам так эти коды символов в голову втемяшились, что Вы без них не можете обойтись!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.04.2012, 10:09   #9
Van-89
Пользователь
 
Регистрация: 06.12.2011
Сообщений: 23
По умолчанию

К сожалению с кодом который предоставил denisbrain так и не смог разобраться((...
Van-89 вне форума Ответить с цитированием
Старый 19.04.2012, 10:10   #10
Van-89
Пользователь
 
Регистрация: 06.12.2011
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
а в чём проблема читайте строку и разбивайте её на слова
с помошью copy и delete
Скорей всего так и придётся делать... спс за подсказку)...
Van-89 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ считывание текста из файла Karina89 Помощь студентам 4 16.10.2011 10:56
считывание текста из файла с++ fidot Помощь студентам 0 25.05.2011 14:59
Считывание текста из файла. semchik Общие вопросы Delphi 5 07.04.2011 22:33
Считывание текста файла M@tBe14 Помощь студентам 2 21.09.2010 06:11
Считывание текста из файла в Unicode vicq Общие вопросы C/C++ 0 01.03.2009 13:51