Автор | Сообщение |
|
Отправлено: 21.11.20 18:50. Заголовок: Проблема с чтением файла и форматом конца строки
Добрый вечер! Разбираюсь с 24 заданием - работаю с файлами из архива к 24 заданию. Успешная работа проходит только с одним файлом "24.txt", у которого формат UNIX (LF). Все остальные файлы формата WINDOWS (CRLF) - и с этими файлами программа просто останавливается на строке с assign и думает. И всё. Поменять формат никак не удаётся - в Notepad++ в отличие от обычного блокнота это сделать можно, но если сохраняешь файл, то он все равно выдает формат windows, а его паскаль никак не хочет читать. Что с этим делать?
|
|
|
Ответов - 13
[только новые]
|
|
|
| Администратор
|
Сообщение: 2144
|
|
Отправлено: 21.11.20 19:39. Заголовок: Уточните, пожалуйста..
Уточните, пожалуйста, в какой операционной системе и в какой версии Паскаля вы работаете.
|
|
|
|
Отправлено: 21.11.20 22:19. Заголовок: Операционная система..
Операционная система windows 10, PascalAbc.Net 3.7.1
|
|
|
|
| Администратор
|
Сообщение: 2145
|
|
Отправлено: 21.11.20 22:23. Заголовок: AniShika пишет: Опер..
AniShika пишет: цитата: | Операционная система windows 10, PascalAbc.Net 3.7.1 |
|
Неожиданно. Какой конкретно файл не читается?
|
|
|
|
Отправлено: 22.11.20 09:07. Заголовок: В общем-то все, кром..
В общем-то все, кроме 24.txt То есть все остальные 24-ые с индексами, 7-ые и 8-ые мимо И вот разницу между ними вижу именно в формате 24.txt Любой другой файл
|
|
|
|
Отправлено: 22.11.20 09:46. Заголовок: А можно пример вашег..
А можно пример вашего кода посмотреть? Проверил лично, все файлы читаются корректно.
|
|
|
|
Отправлено: 22.11.20 10:27. Заголовок: Ну если взять просто..
Ну если взять просто максимально самое простое, потому что упростила до сам код до минимума, когда вдруг сложный не сработал на других файлах. Имя файла меняется, расположение файла и программы всегда в одной папке. На 24-ом работает, на остальных файлах на строчке "assign( input, '24.txt');" зависает просто при запуске и дальше не идёт var s: string; i: integer; begin assign( input, '24.txt'); readln(s); for i:=1 to length(s) do writeln(s); end.
|
|
|
|
Отправлено: 22.11.20 10:30. Заголовок: Я удивлён что это во..
Я удивлён что это вообще работает! Писать надо так var f1 :text; s : string; begin assign(f1,'24-j7.txt'); reset(f1); s:=f1.ReadString(); ... end.
|
|
|
|
Отправлено: 22.11.20 11:15. Заголовок: Просто в файле с поя..
Просто в файле с пояснениями про это задание написано так: "В языке PascalABC.NET можно выполнить перенаправление потока ввода: assign( input, 'k7.txt' ); readln(s); программа будет «думать», что читает данные, введённые с клавиатуры (с консоли), а на самом деле эти данные будут прочитаны из файла k7.txt" И что этого будет достаточно. Так же разбором к задаче Р-07 (демо-21) (цитирую условие): Текстовый файл 24.txt состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны. Для выполнения этого задания следует написать программу. И приведённое решение: var maxLen, curLen, i: integer; s: string; begin assign(input, '24.txt'); readln(s); maxLen := 1; curLen := 1; for i:=2 to Length(s) do if s <> s[i-1] then begin curLen := curLen + 1; if curLen > maxLen then maxLen := curLen; end else curLen := 1; writeln(maxLen); end. И для других заданий аналогично. Поэтому писала без того, как написали вы
|
|
|
|
Отправлено: 22.11.20 11:18. Заголовок: И как тогда правильн..
И как тогда правильно и что всё же нужно писать для чтения файла?
|
|
|
|
| Администратор
|
Сообщение: 2146
|
|
Отправлено: 22.11.20 11:34. Заголовок: AniShika пишет: И ка..
AniShika пишет: цитата: | И как тогда правильно и что всё же нужно писать для чтения файла? |
|
На самом деле проблема была не в том, что используется перевод строки в стиле Windows, а в том, что в остальных файлах вообще не было символов перевода строки. А функция readline ждет, пока не получит такой символ. Сейчас я добавил перевод строки во все файлы и все должно работать. В программе можно использовать оба варианта, в том числе с перенаправлением потока ввода из файла.
|
|
|
|
Отправлено: 23.11.20 14:44. Заголовок: Про перевод строки н..
Про перевод строки не подумала. Тогда вот что непонятно: Например, взяла файл, сделала в нём несколько строчек, на каждой строчке что-то написано. Но тогда по тому, как я писала выше, что read, что readln считывают только первую строчку, в цикле посимвольно выводят. А как тогда реализовать, чтобы все последующие тоже захватывались? То есть если перевода строки нет и всё как единая строка - тут проблем нет, считывает всё, не важно read, или readln.А если несколько строк, то как их тогда обрабатывать? Потому что я тогда read получаю одну строку, прохожусь по ней for, а остальные как? Если вот на экзамене дан файл именно с кучей переводов строк.
|
|
|
|
|
| Администратор
|
Сообщение: 2156
|
|
Отправлено: 24.11.20 18:23. Заголовок: AniShika пишет: что ..
AniShika пишет: цитата: | что read, что readln считывают только первую строчку |
| var s: string; f: text; begin assign(f, 'test.txt'); reset(f); while not eof(f) do begin readln(f, s); writeln(s); end; end.
|
|
|
|
Отправлено: 23.11.20 15:00. Заголовок: Ещё я так понимаю мо..
Ещё я так понимаю можно сделать так: assign(f, '...'); reset(f); while not eof (f) do begin readln(f, s); ... end; Где он читает посимвольно и каждый символ каждый раз закладывает в s. Но тут тогда мне не очень ясно, как делать какие-то проверки между соседними символами - и я так понимаю именно поэтому цикл while не очень здесь удобен. То есть чтобы сравнивать потом сразу две соседние буквы, например, на совпадение, нужно иметь всю строку разом и рассматривать её как массив, поэтому тот цикл for, что выше, в этом плане кажется как-то логичным, с учётом, что я могу делать проверки, что s <> s[i+1], например. Но вот в цикле for так и не ясно то, что написала выше про чтение всех строк.
|
|
|
|