Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
1

Сохранение/чтение в нетипизированный файл массива используя потоки

12.11.2014, 18:35. Показов 2053. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, необходима помощь, так как не понимаю использования потоков, сделал без них, преподаватель сказал переделать, а так же считать с файла через OpenDialog.
Это описание переменных и типа записи.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
type
  Ticq=record
       Uin: Cardinal;
       Name: string;
       mail: string;
       phone: string;
  end;
const
MaxSize=20;
var
  Form1: TForm1;
  ICQ: Ticq;
  MasIcq: array [1..MaxSize] of Ticq;
  p: Integer;
Имеется данная процедура для сохранения в файл, используя SaveDialog.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.SaveFileClick(Sender: TObject);
var FName: string; num:Integer;
    F: TextFile;
begin
 if p=0 then
   begin
   ShowMessage('База пуста!');
   Exit;
   end
 else
SaveInFile.FileName := FName;
if SaveInFile.Execute then
 begin
  FName := SaveInFile.FileName;
  AssignFile(f,FName);
  Rewrite(f);
  for num:=1 to p do begin
   writeln(F,MasIcq[num].Uin);
   writeln(F,MasIcq[num].Name);
   writeln(F,MasICQ[num].Mail);
   writeln(F,MasICq[num].phone);
  end;
  CloseFile(F);
 end;
end;
Мне необходимо сохранить массив записей в файл, используя потоки, а так же процедура считывания из файла и записать в массив записей, так же используя потоки
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2014, 18:35
Ответы с готовыми решениями:

Сохранение в нетипизированный файл
Нашёл на просторах интернета: var f:file; i:integer; a:word; b:array of byte; begin...

Нетипизированный файл, чтение/запись
Здравствуйте! Подскажите пожалуйста, как побайтно записать в одну строку текстового файла данные из...

Сохранение массива в файл и чтение массива из файла
Имеется массив: int region_coordinates; Надо его записать в файл(неважно, в каком формате,...

Запись многомерного массива в нетипизированный файл
Собственно как? Ну и чтобы потом его считать оттуда можно было.. Перебором всех значений через...

16
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.11.2014, 22:15 2
Цитата Сообщение от sanji2010 Посмотреть сообщение
не понимаю использования потоков
Что конкретно ты не понимаешь ?
0
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
12.11.2014, 22:24  [ТС] 3
Я написал 3 процедуры, я не уверен, правильно ли записывает, или не правильно считывает, хз.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
procedure TForm1.SaveFileClick(Sender: TObject);
var FName: string; num:Integer;
    F: TFileStream;
begin
 if p=0 then
   begin
   ShowMessage('База пуста, введите хотя бы 1 контакт!');
   Exit;
   end
 else
if SaveInFile.Execute then
 begin
  FName := SaveInFile.FileName;
  F:= TFileStream.Create(FName, fmCreate or fmOpenWrite);
  try
   for num:=1 to p do begin
    F.WriteBuffer(MasIcq[num].Uin,SizeOf(MasIcq[num].Uin));
    F.WriteBuffer(MasIcq[num].Name,SizeOf(MasIcq[num].Name));
    F.WriteBuffer(MasICQ[num].Mail,SizeOf(MasICQ[num].Mail));
    F.WriteBuffer(MasICq[num].phone,SizeOf(MasICq[num].phone));
   end;
   finally
   FreeAndNil(F);
  end;
 end;
end;
 
procedure MasToBox;
var i,num:Integer;
begin
 num:=Length(MasIcq);
 for i:=1 to num do  begin
   with MasIcq[i] do
   Form1.ArrUins.Items.Add(IntToStr(Uin));
  end;
 p:=i;
end;
procedure TForm1.LoadFromFileClick(Sender: TObject);
var
  F: TFileStream;
  FName: string; num,i:Integer;
begin
if OpenFile.Execute then
 begin
  FName := OpenFile.FileName;
  F:= TFileStream.Create(FName, fmOpenRead);
  F.Read(MasIcq[1], Length(MasIcq)*SizeOf(MasIcq[1]));
  MasToBox;
  FreeAndNil(F);
 end;
end;
0
Модератор
3491 / 2614 / 741
Регистрация: 19.09.2012
Сообщений: 7,976
12.11.2014, 22:38 4
А чего ты сохраняешь одним способом, а читаешь другим?
И что такое Length(MasIcq)*SizeOf(MasIcq[1])?
0
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
12.11.2014, 22:41  [ТС] 5
Цитата Сообщение от FIL Посмотреть сообщение
А чего ты сохраняешь одним способом, а читаешь другим?
И что такое Length(MasIcq)*SizeOf(MasIcq[1])?
В интернете нашёл, но видно не очень работает ... не могли бы вы помочь?
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.11.2014, 22:48 6
Лучший ответ Сообщение было отмечено sanji2010 как решение

Решение

Цитата Сообщение от sanji2010 Посмотреть сообщение
правильно ли записывает, или не правильно считывает, хз
И то и другое не правильно.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var
 n: Integer;
..
//Сначала следует записать размер массива
  F.WriteBuffer(Num, SizeOf(Num));
..
// Запись одного эл-та массива
  F.WriteBuffer(MasIcq[num].Uin,SizeOf(MasIcq[num].Uin));
  n := Length(MasIcq[num].Name) * SizeOf(Char);
  F.WriteBuffer(n, SizeOf(n));
  F.WriteBuffer(PChar(MasIcq[num].Name)^, n));
  n := Length(MasIcq[num].Mail) * SizeOf(Char);
  F.WriteBuffer(n, SizeOf(n));
  F.WriteBuffer(PChar(MasIcq[num].Mail)^, n));
  n := Length(MasIcq[num].Phone) * SizeOf(Char);
  F.WriteBuffer(n, SizeOf(n));
  F.WriteBuffer(PChar(MasIcq[num].Phone)^, n));
..
//Сначала следует прочитать записанный ранее размер массива и подготовить массив соотв.размера
  F.ReadBuffer(Num, SizeOf(Num));
 
// Чтение одного эл-та массива 
  F.ReadBuffer(MasIcq[i].Uin,SizeOf(MasIcq[i].Uin));
  F.ReadBuffer(n, SizeOf(n));
  SetLength(MasIcq[i].Name, n div SizeOf(Char));
  F.ReadBuffer(PChar(MasIcq[i].Name)^, n));
  F.ReadBuffer(n, SizeOf(n));
  SetLength(MasIcq[i].Mail, n div SizeOf(Char));
  F.ReadBuffer(PChar(MasIcq[i].Mail)^, n));
  F.ReadBuffer(n, SizeOf(n));
  SetLength(MasIcq[i].Phone, n div SizeOf(Char));
  F.ReadBuffer(PChar(MasIcq[i].Phone)^, n));
1
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
12.11.2014, 23:17  [ТС] 7
Цитата Сообщение от mss Посмотреть сообщение
И то и другое не правильно.
На PChar ругается
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.11.2014, 09:53 8
ну напиши PAnsiChar
0
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
13.11.2014, 10:00  [ТС] 9
Цитата Сообщение от mss Посмотреть сообщение
И то и другое не правильно.
На PChar ругается
Цитата Сообщение от mss Посмотреть сообщение
ну напиши PAnsiChar
Тоже показывает, что ошибка
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.11.2014, 10:12 10
Что, вот прямо так и говорит "показываю что ошибка" ?)
Неужели так трудно дотумкать - процитировать сюда дословный текст сообщения об ошибке ?
0
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
13.11.2014, 10:55  [ТС] 11
Цитата Сообщение от mss Посмотреть сообщение
Что, вот прямо так и говорит "показываю что ошибка" ?)
Неужели так трудно дотумкать - процитировать сюда дословный текст сообщения об ошибке ?
Unsafe type PChar
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.11.2014, 11:04 12
Ты вообще ошибку от предупреждения в состоянии отличить ?
0
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
13.11.2014, 11:19  [ТС] 13
Цитата Сообщение от mss Посмотреть сообщение
Ты вообще ошибку от предупреждения в состоянии отличить ?
В этой строке
Delphi
1
F.ReadBuffer(PChar(MasIcq[i].Name)^, n));
выдаёт ошибку Constanr object cannot be passed as var parametres
0
Модератор
3491 / 2614 / 741
Регистрация: 19.09.2012
Сообщений: 7,976
13.11.2014, 11:25 14
Сделай строки в записи фиксированной длины и все существенно упростится.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.11.2014, 11:36 15
Delphi
1
2
3
4
5
var
  s: String;
..
F.ReadBuffer(PChar(s)^, n));
MasIcq[i].Name := s;
Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от FIL Посмотреть сообщение
Сделай строки в записи фиксированной длины и все существенно упростится
Тогда от нетипизированности не останется и следа)

1
0 / 0 / 1
Регистрация: 14.03.2014
Сообщений: 41
13.11.2014, 11:52  [ТС] 16
Цитата Сообщение от mss Посмотреть сообщение
Код Delphi
1
2
3
4
5
var
* s: String;
..
F.ReadBuffer(PChar(s)^, n));
MasIcq[i].Name := s;
Тоже самое выдаёт

Добавлено через 3 минуты
А нет, это заработало, но вылетела ошибка Stream read error
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.11.2014, 12:09 17
Ну ей-богу - что ты как детский ребенок ?
По любому чиху у тебя ступор приключается)
Думать-то хоть чуток нужно !

Delphi
1
  F.ReadBuffer(n, SizeOf(n)); // эта строчка куда у тебя делась, мыши съели ?)
0
13.11.2014, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2014, 12:09
Помогаю со студенческими работами здесь

Потоки ввода/вывода. Сохранение информации в файл и ее считывание оттуда
Всем доброго времени суток. Неделю две назад я начал делать программу, которая бы сохраняла...

Потоки и запись/чтение в/из одного массива
Имеется массив данных (каких - неважно, пусть double). Один поток пишет данные. Остальные (один...

Чтение и сохранение из/в файл
Добрый день. Требуется дополнение к коду. Нужно читать элементы из файла в динамический массив и...

Чтение и сохранение в файл
Добрый день! Помогите делаю прогу, к-я по входным параметрам a,b,c вычисляет x,y,z.(компоненты...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru