Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Cчитать файл (http://www.tehnari.ru/f43/t265244/)

SoBadDay 18.08.2019 17:55

Cчитать файл
 
Имеется текстовый файл, в котором символы могут быть расположены как угодно. Количество строк/символов не ограничено. Нужно скопировать данный текст в строку.
Помогите пожалуйста.

AlexZir 19.08.2019 08:20

Цитата:

Сообщение от SoBadDay (Сообщение 2658525)
Количество строк/символов не ограничено

Сколько угодно символов в одну строковую переменную не уместится, там ограничение по количеству символов, не более 256. Задачу можно решить при помощи дополнительного результирующего файла.
Вот вам некоторые команды в помощь:
Цитата:

Создание файла
Assign(<имя файловой переменной>, <имя файла>)
Процедура Assign связывает переменную файлового типа с физическим файлом. Например, установить соответствие между переменной Fil и текстовым файлом lot, расположенном на диске D, можно так:
Assign(Fil, ‘D:\lot.txt’)
Режим чтения
Reset(<имя файловой переменной>)
Процедура Reset открывает файл в режиме чтения, после чего оператором Read(<файловая переменная>, <считываемый элемент>) можно осуществить последовательное считывание элементов в программу.
Конец файла
ЕOF(<имя файловой переменной>)
Количество элементов в файле заранее не определяется, но часто необходимо знать о моменте достижения конца файла. Для этого в Паскале существует логическая функция EOF, которая проверяет достигнут ли конец, и если это так, то принимает значение True, иначе – False. Осуществляется проверка, как правило, в цикле, в качестве условного выражения выступает функция EOF.
Режим записи
Rewrite(<имя файловой переменной>)
Открыв файл в режиме записи, можно поэлементно записать в него информацию, воспользовавшись процедурой Write(<файловая переменная>, <элемент>).
Закрытие файла
Close(<имя файловой переменной>)
Процедура Close закрывает открытый файл, а также освобождает файловую переменную, указанную в качестве параметра.
Запись в файл:
Write(f, список переменных); Процедура записывает в файл f всю информацию из списка переменных.
Чтение из файла:
Read(f, список переменных); Процедура читает из файла f компоненты в указанные переменные. Тип файловых компонент и переменных должны совпадать

Vladimir_S 19.08.2019 08:29

Цитата:

Сообщение от AlexZir (Сообщение 2658582)
Сколько угодно символов в одну строковую переменную не уместится, там ограничение по количеству символов, не более 256.

Лёш, сейчас это не совсем так: есть современные варианты Паскаля, допускающие длинные строки. Естественно, ТС традиционно не соблаговолил указать реализацию среды, в которой нужно решить задачу.
Тут другое интересно.
Ладно, ограничимся 256-ю символами, не суть. А вот как перегнать файл в строку, обойдя служебные символы конца строки (заменив их пробелами), и можно ли это в принципе? Вчера весь вечер пытался — не сумел. Стыдно чертовски, прям под землю провалиться! Есть идеи?

AlexZir 19.08.2019 08:50

Команда ветвления вам в помощь, конец строки EOLn он же CHR(13), конец файла EOF :)

Vladimir_S 19.08.2019 08:56

Цитата:

Сообщение от AlexZir (Сообщение 2658584)
Команда ветвления вам в помощь, конец строки EOL он же CHR(13), конец файла EOF

Лёш, ну право... А то я не пытался! Либо не срабатывает, либо программа идёт в разнос (между прочим, не EoL, а EoLn). Ч-черт, с указателями, что ли, заводиться?

Vladimir_S 19.08.2019 10:24

Вложений: 2
Во зар-раза, нашёл-таки способ!
Код:

Var
 f:Text;
 S,S1:String;
 i:Integer;

Begin
 Assign(f,'ttt.txt');
 Reset(f);
 S:='';
 Repeat
  Readln(f,S1);
  for i:=1 to Length(S1) do S:=S+S1[i];
  if Not(EoF(f)) then S:=S+' ';
 Until EoF(f);
 Close(f);
 Writeln(S);
 ReadLn
End.

Исходный файл:
Вложение 442688
Строка:
Вложение 442689

AlexZir 19.08.2019 10:28

Идея такая:
Заводим цикл с условием выхода Not(Eof);
Читаем строку командой ReadLN(f,s);
Посимвольно записываем эту строку в результирующий файл.
Тем самым избавляемся от проблемы обработки символа конца строки.


ПыСы: почти что то же самое в вашем решении, опоздал я маленько :)

Vladimir_S 19.08.2019 10:31

Вот! Решили офигенную задачу. В два выдающихся ума!

AlexZir 19.08.2019 10:32

Да я и не пытался, куда уж мне :))


Часовой пояс GMT +4, время: 11:06.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.