Помощь - Поиск - Пользователи - Календарь
Полная версия: Открыть созданный файл
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Free Pascal, Pascal ABC и другие
camac
Бодрого дня, господа.
Подскажите, пожалуйста. Я никак не найду решения своей задачки.
Суть:
я создаю файл таким вот образом:
var nameFile,ccc : string;
myFile : text;
begin
gotoxy(3,3);
write('Введите название файла: ');
otoxy(58,3);
write('______');
gotoxy(59,3);
readln(nameFile);
nameBasa:=nameFile+'.dat';
gotoxy(3,6);
write('Вы создали файл: ');
textcolor(14);
write(nameFile);
assign (myFile,nameFile);
rewrite(myFile);
readkey;
end.


Как мне теперь его открыть. При условии, что я не знаю, как он называется. Но его имя, по идее, есть в переменной myFile.
Делаю так:

reset(myBasa);
while not eof(myFile) do
begin
readln(myFile,ccc);
writeln(ccc);
end;


, но не работает.
Подскажите - как правильно сделать?
OCTAGRAM
Перед Reset тоже нужен Assign
Федосеев Павел
Тип переменной Text, как и file - это обычный record. Среди полей есть и имя файла. И это имя можно прочитать.
Единственно, состав этой структуры не гарантирован в будущих версиях.
https://www.freepascal.org/docs-html/curren…12-2260008.2.14

Как ни странно, сам тип в явном виде описан не в System, а в другом модуле.
Так, для FreePascal
program test;

uses
SysUtils;

var
myFile: Text;
begin
Assign(myFile, 'MyFileName.txt');
rewrite(myFile);
writeln(myFile, 'string');
Close(myFile);

Writeln('file name: ', TextRec(myFile).Name);
end.
OCTAGRAM
record там с недоделанным ООП.

Замысел в том, что через Text можно работать с принтером (AssignPrn), консолью (AssignCrt) или вообще написать свой обработчик. Хоть с TCP, хоть как. В School Pak, в AnsiFile, например, файлы из ANSI в OEM и обратно на лету перекодируются, так обработчики запрограммированы.

Конкретно System.Assign подготавливает Text к работе с обычным файлом.

Это всё очень похоже на TStream, но TStream, как создан, так уже понятно, как с ним работа будет идти, а Text — это как недоделанный TStream, который после Assign ещё не знает, будет ли он открыт на чтение, на запись или на запись после конца файла.
Федосеев Павел
Когда, то "прикручивал" к TurboPascal работу с длинными именами. Помню, что тоже мудрил с этой структурой - делал свой Assign, Reset, Rewrite.

Я и раньше почти не программировал, а сейчас уже и забыл как это. При помощи ООП пробовал силы лишь для простенькой утилиты обработки текстового файла (TStringList). Пробовал читать о TStream и его производных, но так и не понял их преимуществ над обычными file и text. В примерах программ на форумах замена TStream на text ничего не меняла, кроме "чистоты ООП".
OCTAGRAM
У File как раз нет ООП. Ну, кроме того ООП, что заложено в ядре OS и доступно через THandle.

У Text есть обработчики, и только над Text можно поколдовать, чтоб направить в каком-то необычном направлении. Но Text принципиально текстовый. В древних версиях он ещё состоял из байтов, но Delphi 2009+ и FPC 3.0+ диктуют, что он должен быть Юникодный. То есть, Text — это, скорее, http://docwiki.embarcadero.com/Libraries/R…ses.TTextReader и TTextWriter, два в одном.

А для двоичных данных как раз и есть TStream.

При использовании ООП про конкретную переменную можно знать, что она не просто TStream, а его потомок с дополнительными методами. Например, можно создать TMemoryStream, дать другому модулю записать в него как в абстрактный TStream, а потом, пользуясь этим знанием, узнать размер и подвигать курсором.

У Text нет Seek, и недоделанное ООП не даёт цивилизованного способа недостающие операции добавить.
Федосеев Павел
Спасибо.

Как понимаю, применение file и TStream на уровне приверженности к ООП.

Для работы с текстом мне больше понравилось использовать TStringList, чем Text. Но использовал для небольших файлов (менее 1 МиБайт). Понравилось удобство доступа к каждой строке.
camac
Спасибо откликнувшимся. Разобрался.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.