0 / 0 / 0 Регистрация: 12.12.2012 Сообщений: 16 |
|
1 |
|
Поиск чисел в текстовом файле17.09.2013, 17:35. Показов 5149. Ответов 4
Дан текстовый файл (любой). ps: нужно вывести только числа. Например, “dsfj53dfj” будет являться словом, и 53 выводить не надо.
0 |
Jener 228 / 225 / 220 Регистрация: 03.07.2012 Сообщений: 466 |
||||
18.09.2013, 11:51 |
2 |
|||
В fpc вроде работает как надо, исходный текст файл создаётся программой :
1 |
erl27 906 / 754 / 833 Регистрация: 06.09.2013 Сообщений: 1,561 |
||||
18.09.2013, 17:15 |
3 |
|||
Добавлено через 1 час 50 минут Забыл сделать ещё одно замечание, что данный код работает в PascalABC.Net,
1 |
0 / 0 / 0 Регистрация: 12.12.2012 Сообщений: 16 |
|
18.09.2013, 19:47 [ТС] |
4 |
Торович, erl27, спасибо большое!
0 |
Jener 228 / 225 / 220 Регистрация: 03.07.2012 Сообщений: 466 |
||||
16.10.2013, 08:00 |
5 |
|||
1 |
uses crt; const cf=['0'..'9']; var nf,s,s1,max:string; f:text; n,i,j,k:byte; begin clrscr; write('Имя файла для чтения: '); readln(nf); nf:=nf+'.txt'; assign(f,nf); {$I-} reset(f); {$I+} if IOResult <> 0 then begin writeLn('Не могу открыть файл ',nf); writeLn('Работа программы завершена. Нажмите ENTER'); readln; exit; end; readln(f,s); writeln(s); writeln('Числа в строке:'); i:=1;max:='0'; while i<=length(s) do if (s[i] in cf)and (not(s[i-1]in cf)or(i=1)) then{если цифра, а перед ней не цифра, или она первая} begin k:=i;s1:=''; while (s[k] in cf)and(k<=length(s))do {пока цифры и не конец строки} begin s1:=s1+s[k];{составляем строку-число} k:=k+1;{идем вперед} end; write(s1,' '); if s1>max then max:=s1;{если больше всех, это макс.} i:=i+length(s1);{перепрыгиваем} end else i:=i+1;{иначе идем вперед} writeln; write('Максимальное число=',max); readln end.
На занятии будет рассмотрена работа с текстовыми файлами в Паскале и разобраны конкретные решенные примеры задач
Содержание:
- Работа с файлами в паскале
- Текстовые файлы в паскале: процедуры работы
- Открытие файла (классический Pascal)
- Чтение из файла (классический Pascal)
- Запись в текстовый файл (классический Pascal)
- Процедуры работы с файлом и закрытие файла
- Работа с данными из файла как с массивом
Работа с файлами в паскале
Виды файлов в зависимости от их описания и режимом работы
- текстовые (тип text) файлы со строками неопределенной длины;
- файлы с типом записей (двоичные или типизированные (file of) );
- файлы без типа для передачи данных блоками записей нетипизированные (file).
Описание файловых переменных:
var f1: file of char; {типизированный файл} f2: file of integer; {типизированный файл} f3: file; {нетипизированный файл} f: text; {текстовый файл}
Для связи файла в коде программы и действительного файла на внешнем носителе используется процедура ASSIGN
:
assign(myfile,'c:text.txt');
где myfile
— имя переменной (объявленной ранее в области var
), ассоциированной с файлом
c:text.txt
— путь к реальному файлу
Первый аргумент процедуры assign в паскаль — переменная, второй – путь к файлу на диске.
Для считывания из файла достаточно связать поток ввода с файлом:
Считывание строки | Считывание массива из N целых |
begin Assign(input,'24.txt'); var s := ReadString; ... end. |
begin Assign(input,'26.txt'); var N := ReadInteger; var a := ReadArrInteger(N); ... end. |
Текстовые файлы в паскале: процедуры работы
Текстовый файл в Паскале — это совокупность строк произвольной длины, которые разделены между собой метками конца строки, а весь файл заканчивается меткой конца файла.
Важно: Если быть точными, то каждая строка текстового файла завершается специальной комбинацией, называемой «конец строки».
Комбинация «конец строки» состоит из двух символов: перевод каретки (ASCII-код #13
) и перевод строки (#10
). Завершается текстовый файл символом конец файла (#26
).
Возможные расширения файлов:
*.txt, *.log,
*.htm, *.html
Метод работы с текстовым файлом в Паскале предусматривает лишь последовательный доступ к каждой строке файла. Это означает, что начинать всегда возможно только с первой строки, затем проходя по каждой строке, дойти постепенно до необходимой. Т.е. можно сказать, что чтение (или запись) из файла (в файл) ведутся байт за байтом от начала к концу.
Предусмотрены два режима работы: режим для записи в файл информации и для чтения ее из файла. Одновременная запись и чтение запрещены.
Открытие файла (классический Pascal)
Допустим, мы в программе описали переменную для работы с текстовым файлом:
Рассмотрим дальнейшую последовательность работы с ним, и рассмотрим процедуры, необходимые для работы с текстовым файлом в Паскале:
процедура открытия существующего файла для чтения при последовательном доступе:
процедура открытия создаваемого файла для записи в него информации; если файл с таким именем уже существует, то информация в нем стирается:
процедура добавления в конец:
- При открытии курсор устанавливается в начало файла.
Чтение из файла (классический Pascal)
Read (f, список переменных); ReadLn (f, список переменных);Отличие
ReadLn
отRead
в том, что при использовании readln после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки.
- чтение осуществляется с той позиции, где в данный момент стоит курсор;
- после чтения курсор сдвигается к первому непрочитанному символу.
EOF (end of file)
.EOL (end of line)
.close ( f ); reset ( f ); { начинаем с начала }
Запись в текстовый файл (классический Pascal)
Write (f, список переменных); WriteLn (f, список переменных);где
f
— файловая переменная, а второй параметр – выводимые из программы и вводимые в файл данные (в виде значений переменных или просто данные)
Процедуры работы с файлом и закрытие файла
Нахождение конца файла:
Логическая функция, возвращающая True, если достигнут конец файла.
Нахождение конца строки:
Логическая функция, возвращающая True, если достигнут конец строки.
Удалить файл в Паскале
Переименование файла в Паскале
rename(переменная_файла,'новое имя файла');Закрытие:
Close (f); {закрытие файла}
Важно: Таким образом, работа с файлом осуществляется через три основных шага:
- Процедура assign.
- Процедура reset или rewrite.
- Процедура close.
Рассмотрим пример работы с файлами в паскале:
Пример 1: В файле text.txt записаны строки. Вывести первую и третью из них на экран.
(предварительно создать text.txt с тремя строками)
Решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример 2: Дан текстовый файл. Вывести количество содержащихся в нем символов и строк (маркеры концов строк EOLN и конца файла EOF при подсчете количества символов не учитывать).
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример 3:
Считать из файла input.txt числа (числа записаны в столбик). Затем записать их произведение в файл output.txt
Решение:
Паскаль | PascalAbc.NET | ||
---|---|---|---|
|
begin Assign(input, 'input.txt'); Assign(output, 'output.txt'); var p := 1; while not eof(input) do begin var x := readInteger; p := p * x; end; print($'произведение {p}'); end. |
pascal file text1. В цикле записать в файл числа от 1 до 10 (каждое — в своей строке), а затем их считать и отобразить на экране.
Дополните код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
var filetext: text; a:string; i:integer; begin assign(filetext,'c:text.txt'); rewrite(filetext); for i:=1 to 10 do ... reset(filetext); for i:=1 to 10 do begin ... ... end; close(filetext); end. |
pascal file text2. Даны целые положительные числа N и K. Создать текстовый файл и записать в него N строк, каждая из которых состоит из K символов «*» (звездочка).
pascal file text3. Дана строка S
и текстовый файл. Добавить строку S
в конец файла.
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
pascal file text4. Дано целое число K
и текстовый файл. В данном файле вставить пустую строку перед строкой с номером K
. Если строки с таким номером нет, то оставить файл без изменений.
Для решения задачи можно использовать дополнительный временный файл.
Пример 5: Дано целое число K
и текстовый файл. Удалить из файла строку с номером K
. Если строки с таким номером нет, то оставить файл без изменений.
Примерный результат:
до:
>> 2 0line 1line 2line 3line
после:
0line 2line 3line
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Пример 6: Дан текстовый файл F1
с набором нулей и единиц. Необходимо заменить все вхождения сочетаний 101
на 000
. Скорректированные записи поместить в файл F2
.
* Использовать функции для работы со строками:
— Pos()
— Delete()
— Insert()
Показать решение:
Паскаль | PascalAbc.NET | ||||
---|---|---|---|---|---|
|
|
Работа с данными из файла как с массивом
Пример 7: В файле input.txt записаны числа (каждое — с новой строки), их количество не превышает 100. Необходимо отсортировать их по возрастанию и записать в файл output.txt.
Трудности:
- для сортировки необходим массив, для того чтобы одновременно работать со всеми числами;
- неизвестно общее количество чисел.
Алгоритм решения:
- объявляем массив для 100 элементов;
- открываем файл на чтение, просчитываем количество чисел, заполняя массив, сохраняем количество в N;
- сортируем N элементов массива;
- записываем результат в файл.
Фрагмент решения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ Определяем глобальные переменные: } var A: array[1..100] of integer; f: text; N, i: integer; { Определяем функцию, считывающую числа из файла, и записывающую их в массив. Функция возвращает кол-во элементов массива: } function ReadFromFile: integer; var i: integer; begin assign(f, 'input.txt'); ...;{ открытие файла в режиме чтения } i := 0; while (...) and (...) do begin i := i + 1; readln(...,...); end; close(f); ReadFromFile := i; end; { Основная программа } Begin N := ReadFromFile ; { сортировка N элементов по возрастанию } { ... } { запись отсортированного массива в файл: } assign(..., ...); ...;{ открытие файла в режиме записи } for i:=1 to N do writeln(..., ...); close(f); end. |
pascal file text5. В файле input.txt записаны числа (каждое — с новой строки), их количество не превышает 100. Необходимо найти максимальное и минимальное число и записать их в файл output.txt.
pascal file text6. Дан текстовый файл. Удалить из него все пустые строки.
А теперь вернемся к олимпиадному заданию по Паскалю, частично решенному на одном из предыдущих заданиях:
Пример 8: Шифр Цезаря заключается в том, что каждая буква исходной строки заменяется третьей после нее буквой в алфавите, который считается написанным по кругу (все символы текста латинские и прописные).
Решить ту же задачу, в которой сдвиг будет не на 3 позиции, а на k, причем отрицательное значение является признаком сдвига влево, положительное — вправо.
Формат входных данных (файл p.in): В первой строке записано число k, не превышающее по модулю 20. Во второй строке — текст, который необходимо зашифровать. Все символы текста латинские и прописные.
Формат выходных данных (файл p.out): Выведите зашифрованный текст.
Пример:
p.in | p.out |
---|---|
3 hello earth |
khoor hduwk |
* желательно создать файлы и записать данные в исходный файл «вручную»
* программа решена для k=3, выполните программу для любых k (не превышающих 20 по модулю)
Фрагменты кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var a:char; i,n,k:byte; s,s1:string; f_in,f_out:text; begin Assign(F_in,'z:p.in'); Assign(F_out,'z:p.out'); Reset(F_in); Rewrite(F_out); s1:=''; readln(f_in,k); readln(f_in,s); for i:=1 to length(s) do begin n:=ord(s[i]); if n<>32 then {32 - пробел} n:=n+3; if ... then ...; if ... then ...; if ... then ...; a:=chr(...); s1:=...; end; writeln(s1); writeln(f_out,s1); close(f_in); close(f_out) end. |
pascal file text7. Пять делителей.
Имя входного файла: z3.in
Имя выходного файла: z3.out
Найти сумму всех чисел от 1 до n, имеющих ровно 5 делителей.
Единица и само число входят в число его делителей.
Входные данные
В единственной строке входного файла z3.in записано одно натуральное число n(1 <= n <= 1012).
Выходные данные
В единственную строку выходного файла z3.out нужно вывести одно натуральное число — найденную сумму.
Примеры:
z3.in | z3.out |
---|---|
50 | 16 |
200 | 97 |
2015 | 722 |
* Олимпиадное задание (11 класс, 2016)
Считывание информации из файла в целочисленную или вещественную переменную аналогично описанному в предыдущем уроке способу. Например, если в файле записаны числа: 10 25 63 42 58, то в целочисленную переменную будет записано только число 10. Для того чтобы все числа были считаны из файла и выведены на экран также используют цикл с признаком конца файла.
Напишем программу, которая подсчитывает количество положительных чисел, хранящихся в текстовом файле. Для этого в директории, где хранятся наши программы необходимо создать текстовый файл. Я создал текстовый файл «chislo.dat» и поместил туда несколько чисел.
Обратите внимание, что данному файлу я присвоил расширение «.dat». Дело в том, что текстовые файлы не обязательно должны иметь расширение «.txt». В файле формата «.dat» также могут храниться текстовые данные и такие файлы можно открыть любым текстовым.
Считывание информации из файла в целочисленную или вещественную переменную.
program file4; uses crt; var f:text; a:integer; k:integer; begin clrscr; assign(f,'programs/chislo.dat'); reset(f); k:=0; while not eof(f) do begin read(f,a); if a>0 then inc(k); end; close(f); writeln('k=',k); readln end.
Строка №3. Создаем файловую переменную «f», для доступа к файлу.
Строка №4. Целочисленную переменную «a» будем использовать в качестве буферной переменной. В нее мы будем считывать числа из файла для определения, являются ли эти числа положительными или отрицательными.
Строка №5. Переменную «k» будем использовать для хранения количества положительных чисел.
Строка №8. Связываем файловую переменную «f» с файлом «chislo.dat», хранящемся на жестком диске «С» в директории «FPC2.2.2bini386-win32Programs».
Строка №9. Открываем этот текстовый файл для чтения.
Строка №10. Обнуляем переменную для подсчета количества положительных чисел.
Строка №11. Указываем условие. Пока нет конца файла, должны выполняться действия в строках №13–№14.
Строка №13. Читаем из файла число и записываем его в буферную переменную «a».
Строка №14. Проверяем условие. Если значение переменной «a» (т.е. число, считанное из файла) больше 0, тогда увеличиваем переменную «k» на единицу.
Строка №17. Выводим на экран количество положительных чисел.
Предыдущая статья : Файлы в Паскаль (часть 2).
Оглавление : Уроки Паскаль. Файлы.
Следующая статья : Текстовые файлы.
Записал числа в файл:
var
f: file of integer;
sym, i: integer;
begin
assign(f, 'C:UsersHOMeDesktopPascalnumbers.txt');
rewrite(f);
for i := 1 to 10 do
begin
read(sym);
write(f, sym);
end;
close(f);
end.
Теперь хочу просмотреть их в файле, но, естественно, с помощью текстового редактора (блокнота,к примеру) этого не сделать.
Как можно увидеть введенные в текстовый файл числа?
hedgehogues
9,2218 золотых знаков44 серебряных знака93 бронзовых знака
задан 22 мар 2017 в 18:39
2
Вам нужно разобраться с таким понятием как бинарные файлы. В данном случае работаете Вы именно с ними. Вы же хотите увидеть текст, т.е. символы. Приведу пример.
Все символы имеют свой код. Так, когда Вы записываете числа в файл, происходит запись кодов, который соответствуют некоторым символам. Таблицу символов можно глянуть тут. Например, если Вы введёте с клавиатуры число 0, то в файл запишется NUL
, если это будет 80, то запишется 0
. 90 — *
и т.д. Всё это можно отследить по таблице, которую я привёл выше. Замечу, что там все коды указаны в 16-ой системе.
ответ дан 23 мар 2017 в 7:06
hedgehogueshedgehogues
9,2218 золотых знаков44 серебряных знака93 бронзовых знака