| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Как прочитать текстовый файл целиком |
| Автор: Bugmaker 31.5.2009, 14:52 | ||
| Добрый день. Задача следующая: Написать программу, которая считывает текст из файла и выводит предложения, которые не содержат запятых. Разобрался как работать с ReadLn, но загвоздка в том, что предложение может начиниться на одной строке, а заканчиватьяс на другой. Как прочитать весь файл целиком в массив, или, возможно есть другйо способ разделить файл на предложения...
Пытаюсь сделать так, но получаю ошибку. Насколько я понимаю ошибука обращения к памяти |
| Автор: kami 31.5.2009, 19:03 | ||
|
| Автор: Bugmaker 31.5.2009, 19:16 |
| Не определены Result и PosEx.... Они должны быть integer? Извиняюсь.. вижу что объявлены.. компилятор выдает "Undeclared identifier: 'Result'" "Undeclared identifier: 'PosEx" |
| Автор: Данкинг 31.5.2009, 19:29 |
Ну так объяви его. |
| Автор: Bugmaker 31.5.2009, 19:32 | ||
| Пишу на делфи билдере 7 вот весь код
Сорри комментарии будут крокозябами %) НО они есть в посте kami. Насколько я вижу вот тут: var Form1: TForm1; f:TFileStream; s, offer:string; StartPos, EndPos:integer; // íà÷àëüíàÿ è êîíå÷íàÿ ïîçèöèè ïðåäëîæåíèÿ Counter:integer; implementation Они уже объявлены, где еще это нужно сделать? |
| Автор: Данкинг 31.5.2009, 20:45 |
Русскую раскладку включи перед копированием текста. Извиняюсь, ступил: result - это же к функции относится. А PosEx где объявлена? Это, видимо, функция какого-то модуля. |
| Автор: Bugmaker 31.5.2009, 21:15 | ||
Вобщем вот такой код разбивающий весь файл на char'ы и запоминающий номер точек.. подскажите как теперь из этих char'ов собрать обратно нужные предложения) |
| Автор: kami 31.5.2009, 21:26 |
Я привел код функции. И Result - это результат этой функции. Но! это код для подсчета количества предложений. Всего-то нужно добавить в него одну строку (условный оператор), чтобы получить выполнение задачи Кнопку F1 уже отменили? uses StrUtils; |
| Автор: Bugmaker 31.5.2009, 21:46 |
| kami огромнейшее спасибо, разобрался) |
| Автор: kami 31.5.2009, 21:47 |
Извините - 2 строки: условный оператор и вывод предложения, не содержащего запятых. |
| Автор: Bugmaker 3.6.2009, 21:57 | ||||
| Возникла еще пара вопросов... первый в том, что предложение может оканчиваться вопросительным и восклицательным знаком а не точкой... Второй - запятая может быть в дробном числе.. как учесть эти моменты? Чешу репу, ковыряюсь но надежды на меня мало... Помогите пожалуйста) У меня почему то такое ощущение что все придется переделывать ... не используя PosEx а перебирая каждый символ ( На данный момент код такой:
Думаю стоит перейти к такой вот форме..
|
| Автор: kami 3.6.2009, 22:22 | ||||||||
| Продолжаем. Я не зря сказал, что когда найден offer, с ним можно сделать все, что угодно. С учетом вышесказанного (предложение может заканчиваться вопросительным и восклицательным знаком) дополним код:
Это исходное положение. Изменяем поиск EndPos.
Теперь - заменяем строку исходного текста
на
Сейчас напишу и про расширенный поиск запятых. Добавлено через 2 минуты и 6 секунд Кстати - из-за новой введенной функции текст от последней точки(вопросительного/восклицательного знака) до конца текста (даже если последний символ в тексте не является точкой/знаком) будет считаться предложением. |
| Автор: kami 3.6.2009, 22:40 | ||||
| Дополняем код после Учитываем, что запятая может быть в дроби. Определяем, что дробь - это последовательность символов, включающая запятую, слева и справа от которой расположены цифры.
Теперь после offer:=Copy....... пишем
Писал прямо в браузере, мог с логикой немного напутать (в смысле, not не там, где нужно), но это уже оставляю на твоей совести - должен же быть какой-то творческий процесс |
| Автор: Bugmaker 3.6.2009, 22:55 |
| Result:=Result and not (str[cPos+1] in ['0'..'9'); // следующий символ - не цифра --- тут небольшая опечатка но это мелочи.. Вот эту часть не понял begin // в этой функции предполагается, что в позиции pos находится именно запятая и ничто иное. Result:=True; if cPos>1 then Result:=Result and not (str[cPos-1] in ['0'..'9']); // предыдущий символ -не цифра if cPos<Length(str) then Result:=Result and not (str[cPos+1] in ['0'..'9'); // следующий символ - не цифра end; Пока что програамма наоборот не выводит предложения с дробными числами... Зато выводит с обычными запятыми чего делать не должна( Помоему дело в функции IsValidComma ... Не вижу условия при котором она False... |
| Автор: Bugmaker 3.6.2009, 23:11 | ||
| Спасибо с моментом Result:=Result and not (str[cPos-1] in ['0'..'9']); догнал прямо перед тем как ты пояснил.... "Ну и сделай в последней строке function IsValidComma: Result:=not Result." Если ты об этом:
То при таком раскладе все равно не показывает предложений которые с дробными цифрами.. Или я опять не так понял? |
| Автор: kami 3.6.2009, 23:12 | ||
нет. Я об этом:
|
| Автор: Bugmaker 3.6.2009, 23:14 |
| Да... я опять не так понял) спасибо помоему теперь все работает как надо... |
| Автор: kami 3.6.2009, 23:18 |
Ну теперь у тебя есть полный набор функций для работы по поставленной задаче. При необходимости остается только расширять набор условий, используемых в них. |