Форум » Обработка символьных строк » Проблема с чтением файла и форматом конца строки » Ответить

Проблема с чтением файла и форматом конца строки

AniShika: Добрый вечер! Разбираюсь с 24 заданием - работаю с файлами из архива к 24 заданию. Успешная работа проходит только с одним файлом "24.txt", у которого формат UNIX (LF). Все остальные файлы формата WINDOWS (CRLF) - и с этими файлами программа просто останавливается на строке с assign и думает. И всё. Поменять формат никак не удаётся - в Notepad++ в отличие от обычного блокнота это сделать можно, но если сохраняешь файл, то он все равно выдает формат windows, а его паскаль никак не хочет читать. Что с этим делать?

Ответов - 13

Поляков: Уточните, пожалуйста, в какой операционной системе и в какой версии Паскаля вы работаете.

AniShika: Операционная система windows 10, PascalAbc.Net 3.7.1

Поляков: AniShika пишет: Операционная система windows 10, PascalAbc.Net 3.7.1 Неожиданно. Какой конкретно файл не читается?


AniShika: В общем-то все, кроме 24.txt То есть все остальные 24-ые с индексами, 7-ые и 8-ые мимо И вот разницу между ними вижу именно в формате 24.txt Любой другой файл

cabanov.alexey: А можно пример вашего кода посмотреть? Проверил лично, все файлы читаются корректно.

AniShika: Ну если взять просто максимально самое простое, потому что упростила до сам код до минимума, когда вдруг сложный не сработал на других файлах. Имя файла меняется, расположение файла и программы всегда в одной папке. На 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.

cabanov.alexey: Я удивлён что это вообще работает! Писать надо так [pre2] var f1 :text; s : string; begin assign(f1,'24-j7.txt'); reset(f1); s:=f1.ReadString(); ... end.[/pre2]

AniShika: Просто в файле с пояснениями про это задание написано так: "В языке 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. И для других заданий аналогично. Поэтому писала без того, как написали вы

AniShika: И как тогда правильно и что всё же нужно писать для чтения файла?

Поляков: AniShika пишет: И как тогда правильно и что всё же нужно писать для чтения файла? На самом деле проблема была не в том, что используется перевод строки в стиле Windows, а в том, что в остальных файлах вообще не было символов перевода строки. А функция readline ждет, пока не получит такой символ. Сейчас я добавил перевод строки во все файлы и все должно работать. В программе можно использовать оба варианта, в том числе с перенаправлением потока ввода из файла.

AniShika: Про перевод строки не подумала. Тогда вот что непонятно: Например, взяла файл, сделала в нём несколько строчек, на каждой строчке что-то написано. Но тогда по тому, как я писала выше, что read, что readln считывают только первую строчку, в цикле посимвольно выводят. А как тогда реализовать, чтобы все последующие тоже захватывались? То есть если перевода строки нет и всё как единая строка - тут проблем нет, считывает всё, не важно read, или readln.А если несколько строк, то как их тогда обрабатывать? Потому что я тогда read получаю одну строку, прохожусь по ней for, а остальные как? Если вот на экзамене дан файл именно с кучей переводов строк.

Поляков: AniShika пишет: что read, что readln считывают только первую строчку [pre2] 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.[/pre2]

AniShika: Ещё я так понимаю можно сделать так: assign(f, '...'); reset(f); while not eof (f) do begin readln(f, s); ... end; Где он читает посимвольно и каждый символ каждый раз закладывает в s. Но тут тогда мне не очень ясно, как делать какие-то проверки между соседними символами - и я так понимаю именно поэтому цикл while не очень здесь удобен. То есть чтобы сравнивать потом сразу две соседние буквы, например, на совпадение, нужно иметь всю строку разом и рассматривать её как массив, поэтому тот цикл for, что выше, в этом плане кажется как-то логичным, с учётом, что я могу делать проверки, что s <> s[i+1], например. Но вот в цикле for так и не ясно то, что написала выше про чтение всех строк.



полная версия страницы