Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2010, 07:33   #1
racushka_n
Пользователь
 
Аватар для racushka_n
 
Регистрация: 20.05.2010
Сообщений: 17
Сообщение как записать в файл и считать потом из него три массива с числами

Доброго времени суток.
Стоит такая задача:
есть три динамических массива Y[n],Cr[n/2],Cb[n/2] (n заранее не известна) с вещественными числами в них,
нужно записать их в файл поочередно через запятую,
т.е. Y[],Cr[],Cb[], после чего снова вычислить новые значения этих массивов и записать новые значения в следующую строку.
Кол-во строк m, соответсвенно кол-во вычислений также равно m.
После того как все строки будут заполнены файл сохраняется в namefile.rle.
Затем нужно считать строки из этого файла в таком порядке: загрузить первую строку в массивы Y,Cr,Cb использовать эти значения, загрузить вторую строку и т.д.
Подскажите как это можно сделать, с файлами никогда не работала и с динамическими массивами тоже.
racushka_n вне форума Ответить с цитированием
Старый 28.10.2010, 07:42   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Файлы именно текстовые? Может проще бинарный нетипированный файл?
Или задача так и стоит - "Текстовые файлы"?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2010, 08:12   #3
racushka_n
Пользователь
 
Аватар для racushka_n
 
Регистрация: 20.05.2010
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Файлы именно текстовые? Может проще бинарный нетипированный файл?
Или задача так и стоит - "Текстовые файлы"?
А где у меня написано текстовый файл? В файле будет не текст а числа, и считывать нужно будет числа, а не символы. Файл будет с типом .rle
Его не нужно будет открывать в других программах, только при помощи мною написанной=)
racushka_n вне форума Ответить с цитированием
Старый 28.10.2010, 08:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А где у меня написано текстовый файл?
Вот тут:
Цитата:
нужно записать их в файл поочередно через запятую
И тут:
Цитата:
и записать новые значения в следующую строку.
Строки подразумевают текстовый файл. В типизированных и нетипизированных строк фактически нет, т.е. к ним такое понятие не применяется.
Цитата:
не текст а числа
Вот самый главный вопрос - в каком виде? В удобочитаемом для человека или для машины.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.10.2010, 09:13   #5
racushka_n
Пользователь
 
Аватар для racushka_n
 
Регистрация: 20.05.2010
Сообщений: 17
По умолчанию

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

Цитата:
Сообщение от Stilet Посмотреть сообщение
Вот самый главный вопрос - в каком виде? В удобочитаемом для человека или для машины.
для машины (чтобы использовать в декодере той же программы) отдельно от написанной программы файл не будет представлять из себя никакой ценности=)
racushka_n вне форума Ответить с цитированием
Старый 28.10.2010, 10:20   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

примерно так можно:
Код:
procedure TForm1.buttonSaveClick(Sender: TObject);
var rArr : array of double;
    i, n : integer;
    TfS1 : TFileStream;
begin
  // заполнениние массива
  n := 10;
  SetLength(rArr, n);

  for i:=0 to n-1 do
     rArr[i] := i*10/3;

// сохранить в файл
   TfS1 := TFileStream.Create('namefile.rle',fmCreate   );
   // сначала запишем число записей
   TfS1.Write(n, SizeOf(integer));

   // теперь по очередно все записи
   for i:=0 to n-1 do
     TfS1.Write(rArr[i], SizeOf(double));

   // закроем файл (и осбоводим файловую переменную)
   FreeAndNil(TfS1);


end;

procedure TForm1.buttonLoadClick(Sender: TObject);
var rArr : array of double;
    i, n : integer;
    TfS1 : TFileStream;
begin
   //открываем на чтение
   TfS1 := TFileStream.Create('namefile.rle', fmOpenRead	 );
   // сначала прочитаем число записей
   TfS1.Read(n, SizeOf(integer));

   // установим длину массива
   SetLength(rArr, n);

   // теперь по очередно все записи
   for i:=0 to n-1 do
     TfS1.Read(rArr[i], SizeOf(double));

   // закроем файл (и осбоводим файловую переменную)
   FreeAndNil(TfS1);

   // для отладки выведем данные в мемо;
   Memo1.Lines.clear;
   Memo1.Lines.Append('число записей: '+IntToStr(n));
   for i:=0 to n-1 do
      Memo1.Lines.Append(FloatToStr(rArr[i]));

end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.10.2010, 15:35   #7
racushka_n
Пользователь
 
Аватар для racushka_n
 
Регистрация: 20.05.2010
Сообщений: 17
Смущение

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
примерно так можно:
а можно, пожалуйста, тоже самое только для одного массива, в котором k целых чисел.
Т.е. записать этот массив в файл и потом считать его из сохраненного файла, а то я совсем запуталась

Последний раз редактировалось racushka_n; 28.10.2010 в 15:41. Причина: ошибочка вышла
racushka_n вне форума Ответить с цитированием
Старый 28.10.2010, 15:56   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Serge_Bliznykov, можно проще
Код:
Tfs1.Write(rArr[0],Length(rArr)*SizeOf(rArr[0]));
и не надо цикла
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.10.2010, 17:45   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Пепел Феникса
Код:
Tfs1.Write(rArr[0],Length(rArr)*SizeOf(rArr[0]));
и не надо цикла
я, когда писал пример, думал об этом варианте. Но решил, что надёжность важнее.
Ибо!
ой. не играл бы я в эти игры с памятью. У Вас есть Уверенность, что в динамических массивах память выделяется последовательно? Всегда? Если на миллион чисел выделить динамический массивчик, то все элемены будут строго последовательно в памяти располагаться? Об этом есть информация в документации (у борлада, или, хотя бы у Стив Тейксейра, Ксавье Пачеко или у Марко Кэнту) ?!


Цитата:
Сообщение от racushka_n
а можно, пожалуйста, тоже самое только для одного массива, в котором k целых чисел.
racushka_n,
не, ну это несерьёзно..
Ну неужели совсем-совсем ничего не понятно из моего примера? Я даже комментарии старался/писал.. и всё напрасно?

Код:
procedure TForm1.buttonSaveClick(Sender: TObject);
var Mas : array of integer;
    i, k : integer;
    TfS1 : TFileStream;
begin
  // зададим размер массива
  k := 10;
  SetLength(Mas, k);

  {заполнение массива последовательно числами 0, 1, 2.... K-1}
  for i:=0 to k-1 do
     Mas[i] := i;

// сохранить в файл
   TfS1 := TFileStream.Create('namefile.rle',fmCreate   );
   // сначала запишем число записей
   TfS1.Write(k, SizeOf(integer));

   // теперь по очередно все записи
   for i:=0 to k-1 do
     TfS1.Write(Mas[i], SizeOf(integer));

   // закроем файл (и освободим файловую переменную)
   FreeAndNil(TfS1);


end;

procedure TForm1.buttonLoadClick(Sender: TObject);
var Mas : array of integer;
    i, k : integer;
    TfS1 : TFileStream;
begin
   //открываем на чтение
   TfS1 := TFileStream.Create('namefile.rle', fmOpenRead	 );
   // сначала прочитаем число записей
   TfS1.Read(k, SizeOf(integer));

   // установим длину массива
   SetLength(Mas, k);

   // теперь по очередно все записи
   for i:=0 to k-1 do
     TfS1.Read(Mas[i], SizeOf(integer));

   // закроем файл (и освободим файловую переменную)
   FreeAndNil(TfS1);

   // для отладки выведем данные в мемо;
   Memo1.Lines.clear;
   Memo1.Lines.Append('число записей: '+IntToStr(k));
   for i:=0 to k-1 do
      Memo1.Lines.Append(IntToStr(Mas[i]));

end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.10.2010, 17:53   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

про массив есть увереность, ибо сам смысл слова массив
в Делфи и С это всегда область памяти.

а не последовательно, это список уже всетаки.
Цитата:
Если на миллион чисел выделить динамический массивчик, то все элемены будут строго последовательно в памяти располагаться?
ну если памяти хватит, то да.

скорее всего и в шарпе так же, но так как там нет указателей, то и игр с памятью нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать структуру в файл? и прочитать потом. katushka-1990 Общие вопросы C/C++ 2 23.03.2010 10:07
Как записать (считать) динамическую строку в (из) файл(а)? C++ Сергей089 Помощь студентам 2 10.02.2010 22:00
Как записать данные в MySQL бузу а потом считать их SeRhy PHP 1 12.06.2009 22:15
Как побайтно считать файл и записать в другой SeRhy Общие вопросы Delphi 2 09.06.2008 21:54
Как в Microsoft Visual Basic 6.0 открыть Exel файл, считать с него данные(числа) и дальше работать с ними Dimon88 Microsoft Office Excel 7 20.10.2007 13:30