Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись/чтение из файла двумерного массива(Delphi) 
:(
    Опции темы
Gloomber
Дата 28.4.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 28.4.2006
Где: Moscow

Репутация: нет
Всего: нет



 Подскажите пожалуйста ..... Как записать в файл двумерный массив (или прочитать) ? Текстовый или

 типизированный , не столь важно .

Заранее СПАСИБО!!!   
PM MAIL ICQ   Вверх
DimassS
Дата 28.4.2006, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Вопрос на форуме уже был... не помню где я это нашёл:


Итак, для доступа к текстовым файлам используется переменная типа TextFile. До сих пор не совсем понимаю что это такое физически - что-то типа "внутреннего" паскалевского Handle на файл. 

Итак чтобы ассоциировать файл на диске с переменной надо проделать следующие опрерации: 

1) Определяем файловую переменную: 
 var f:TextFile;     

2) Ассоциируем ее: 

 AssignFile(F, 'c:\MyFile.txt');     


3) Теперь надо этот файл открыть, есть 3 варианта: 
- файла нет или он должен быть перезаписан, открытие для записи: 
Rewrite(f)    

- файл есть и его надо открыть для чтения (с первой строки) 
Reset(f)    

- файл есть и его надо открыть для дописования строк в конец 
Append(f)    

Как видите не хватает очень полезных функций таких как открытия файла для чтения с произвольной строки и для записи в файл произвольной строки. Но надо учесть, что так как длины строк разные, не существует никакого способа узнать физическое место начала например 1000 строки, не прочитав всю тысячу строк. Для записи ситуация еще сложнее - вставить строку означает перезаписать всю информацию после этой строки заново. Таким образом варианты только следующие: 
- Перезаписать весть файл 
- Читать с первой строки 
- Дописать что-то в конец 
- Читать и писать файл целиком (см. выше работу через TStrings) 

В конце работы открытый файл нужно закрыть: 
CloseFile(f);    

Теперь пусть у нас есть строковая переменная s для чтения строки из файла 

Чтение предварительно открытого файла: 
ReadLn(f, s) - будет прочитанна текущая строка и позиция чтения переведена на следующую позицию.    

А как прочитать весь файл? 

While not eof(f) do   
 begin   
 
  
 ReadLn(f, s);   
 
 {здесь делаем что-то с прочитанной строкой}   
 
  
 end;      
 
 
PM MAIL ICQ   Вверх
Snowy
Дата 28.4.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



При помощи типизированных файлов. Для теста - TextFile.
Перебирать все элементы массива и сохранять каждый.
 
PM MAIL   Вверх
WERITAS
Дата 28.4.2006, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Если массив содержит объекты типа, определенного пользователем, то имеет смысл использовать фаловые потоковые классы TFileStream.
 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Gloomber
Дата 28.4.2006, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 28.4.2006
Где: Moscow

Репутация: нет
Всего: нет



Можно чуточку подробнее . 
PM MAIL ICQ   Вверх
Yanis
Дата 28.4.2006, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Если массив статический, то запись и чтение из типизированного файла делается очень легко.
Код

type
  T2DArray = array[0..10] of array[0..20] of Byte;
var
  f: file of T2DArray;
  x: T2DArray;
begin
  AssignFile(f, 'c:\2darray.dat');
  Rewrite(f);
  write(f, x);
  CloseFile(f);
end;
 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
vood
Дата 29.4.2006, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 23.2.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 1



Может не совсем в тему но об этом же
Код записывает в файл содержание stringgrid

Добавлено @ 09:49 
Код

procedure savetofile(str:tstringgrid;fil:string);
var
f:textfile;
cols:string;
rows:string;
d:string;
i:integer;
k:integer;
p:integer;
begin
assignfile(f,fil);
rewrite(f);
writeln(f,str.ColCount);
writeln(f,str.RowCount);
k:=0;
p:=0;
for k:=0 to str.ColCount do begin
for i:=0 to str.RowCount do begin
writeln(f,str.cells[k,i]);
end;
end;
close(f);
end;

 


--------------------
Вы все еще курите ? Тогда мы идем к вам
 
PM MAIL ICQ   Вверх
Quadr0
Дата 29.4.2006, 13:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 11:04
  Вверх
Gloomber
Дата 29.4.2006, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 28.4.2006
Где: Moscow

Репутация: нет
Всего: нет



Хорошо! С типизированными разобрались. А как быть с текстовыми smile  
PM MAIL ICQ   Вверх
DimassS
Дата 29.4.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 12.4.2006
Где: Россия, Иркустк

Репутация: 1
Всего: 2



Var
F: TextFile;//текстовая переменная
MyCol: TStringList;//Количество строк..
SS:String;

begin
MyCol:= TStringList.Create;
MyCol.Clear;

AssignFile(F, 'Путь к файлу');
Reset(F);//открыть для чтения

 While NOT EOF(F) do //пока не кончится файл
begin 
   Readln(F, SS);
        if SS[1] = 't' then Begin //если конечно известна первая буква записи в строке
        MyCol.Add(SS) ;
        end;
end;

Ну вот маленький пример чтения текстового файла... Удачи!  

Это сообщение отредактировал(а) DimassS - 29.4.2006, 19:43
PM MAIL ICQ   Вверх
Gloomber
Дата 29.4.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 28.4.2006
Где: Moscow

Репутация: нет
Всего: нет



 DimassS ты меня не понял. Записать или прочитать последовательность символов я знаю как.
 А вот матрицу чё то не получается.      
PM MAIL ICQ   Вверх
WERITAS
Дата 29.4.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Gloomber, почему бы тебе потоками не воспользоваться? В поток можно поместить что угодно (т.е. записать  и считать в него).  


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Gloomber
Дата 29.4.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 28.4.2006
Где: Moscow

Репутация: нет
Всего: нет



это как smile  
PM MAIL ICQ   Вверх
WERITAS
Дата 29.4.2006, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Код

var f: TFileStream;  // Объявляешь объект потокового класса 
................................
f:=TFileStream.Create(Form1.SaveDialog1.Filename,fmOpenWrite OR fmCreate); //  файл открыт для записи
................................
f.WriteComponent (object); //запись object'а в поток
................................
f.Free; // выгружение потока
//---------------------------------------------------------------------------------------------------
f:=TFileStream.Create(OpenDialog1.Filename,fmOpenRead); // файл открыт для чтения
................................
object:=f.ReadComponent(nil); // чтение object'а из потока.
................................
f.Free; // выгружение потока

Посмотри пример в дельфишном хелпе.
 


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
Yanis
Дата 29.4.2006, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Quadr0 @  29.4.2006,  13:49 Найти цитируемый пост)
З.Ы. Посмотрел в наш фак и что-то не нашёл сабжа.
ИМХО мой код и код Yanis'а было бы неплохо добавить.  

 smile К стати о факе, а когда бедет новая версия Drkb, ведётся ли работа по её доработке?

Добавлено @ 23:29 
Если есть хоть какие-нибудь мысли по этому поводу, пожалуйста ответьте в PM, что бы сильно не флудить smile 


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1354 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.