Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
6 / 6 / 2
Регистрация: 24.09.2012
Сообщений: 381
1

Сохранение в нетипизированный файл

26.03.2014, 10:55. Показов 1845. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нашёл на просторах интернета:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var f:file;
i:integer;
a:word;
b:array[20] of byte;
begin
assignfile(f, 'oladushki.bin');
rewrite(f);
write(f, i, 100);
write(f,a,50);
for i:=0 to 20 do
begin
write(f,b[i],10);
end;
closefile(f);
пишут, что эта цифра (write(f,i,ВОТ ТУТ ОНА) это размер переменной в байтах, тогда как подсчитать размер структур и всего остального, что нужно запихнуть в файл? 1 Структура на все типы не пойдёт, так как сначала мне нужно записать в файл 2 переменные integer (которые обозначают длину массивов), а потом 2 массива.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.03.2014, 10:55
Ответы с готовыми решениями:

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

Нетипизированный файл
Ребята, подскажите, вот условие было, работа с Типизированным и нетипизированным файлами,...

Нетипизированный файл
Подскажите, пожалуйста, как записать массив типа char в нетипизированный файл?

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

12
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.03.2014, 11:00 2
Цитата Сообщение от vadim23409 Посмотреть сообщение
как подсчитать размер структур
Каких конкретно ?

Добавлено через 1 минуту
Цитата Сообщение от vadim23409 Посмотреть сообщение
это размер переменной в байтах
Размер переменной i равен 4 байта, а ты с какого-то перепугу пишешь 100 ..
Та же несуразность с переменной a ..
0
6 / 6 / 2
Регистрация: 24.09.2012
Сообщений: 381
26.03.2014, 11:11  [ТС] 3
Цитата Сообщение от mss Посмотреть сообщение
Каких конкретно ?
ну вот например
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 TMapObject=record 
    positionX:integer;  
    positionY:integer;  
    pointtype:string[50]; 
    ambulancebus_A_count:integer;
    ambulancebus_B_count:integer; 
    ambulancebus_C_count:integer; 
    traffic_jam_radius:integer; 
    traffic_speed_rate:real; 
    traffic_jam_enabled:boolean; 
    startpoint:integer;
    endpoint:integer; 
    chief_Doctor_name:string[70];
    Doctor_tel_number:string[20]; 
    operators_count:integer; 
    rating:string[20]; 
    Sity:string[100];  
    Street:string[100]; 
    House:String[100]; 
    Apartament:string[100]; 
  end;
 
  Tsettings=record 
    FullWindow:boolean;
    size_position_save:boolean;
    positionXform1:integer;
    positionYform1:integer;
    positionXform2:integer;
    positionYform2:integer;
    sizeX:integer;
    sizeY:integer;
    dump_dynamic_arrays:boolean;
    dump_static_arrays:boolean;
    square_selection:integer;
    roadpoint_size:integer;
    roadpoint_vnR:byte; 
    roadpoint_vnG:byte;
    roadpoint_vnB:byte;
    roadpoint_znR:byte;
    roadpoint_znG:byte;
    roadpoint_znB:byte;
 
    ambulance_station_size:integer;
    ambulance_station_vnR:byte;
    ambulance_station_vnG:byte;
    ambulance_station_vnB:byte;
    ambulance_station_znR:byte;
    ambulance_station_znG:byte;
    ambulance_station_znB:byte;
 
    call_center_size:integer;
    call_center_vnR:byte;
    call_center_vnG:byte;
    call_center_vnB:byte;
    call_center_znR:byte;
    call_center_znG:byte;
    call_center_znB:byte;
 
    traffic_jam_size:integer;
    traffic_jam_vnR:byte;
    traffic_jam_vnG:byte;
    traffic_jam_vnB:byte;
    traffic_jam_znR:byte;
    traffic_jam_znG:byte;
    traffic_jam_znB:byte;
 
    dirt_road_width:integer;
    dirt_road_R:byte;
    dirt_road_G:byte;
    dirt_road_B:byte;
 
    road_standart_width:integer;
    road_standart_R:byte;
    road_standart_G:byte;
    road_standart_B:byte;
 
    route_road_width:integer;
    route_road_R:byte;
    route_road_G:byte;
    route_road_B:byte;
  end;
Добавлено через 1 минуту
Цитата Сообщение от mss Посмотреть сообщение
Размер переменной i равен 4 байта, а ты с какого-то перепугу пишешь 100 ..
Та же несуразность с переменной a ..
http://delphi.vov.ru/Dph-11.3.htm
Открывается файл тоже аналогично. Только в процедурах Rewrite или Reset можно задать длину записи в байтах (в данном примере — 512). Если длину не указать, то она устанавливается равной 128 байт.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.03.2014, 11:24 4
Цитата Сообщение от vadim23409 Посмотреть сообщение
как подсчитать размер структур
Например так
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
type
TMapObject=record
    positionX:integer;
    positionY:integer;
    pointtype:string[50];
    ambulancebus_A_count:integer;
    ambulancebus_B_count:integer;
    ambulancebus_C_count:integer;
    traffic_jam_radius:integer;
    traffic_speed_rate:real;
    traffic_jam_enabled:boolean;
    startpoint:integer;
    endpoint:integer;
    chief_Doctor_name:string[70];
    Doctor_tel_number:string[20];
    operators_count:integer; 
    rating:string[20]; 
    Sity:string[100];
    Street:string[100]; 
    House:String[100]; 
    Apartament:string[100];
  end;
 
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var size:integer;
begin
size:=sizeof(TMapObject);
Edit1.Text:=inttostr(size)
end;
Выведет 624
1
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.03.2014, 11:38 5
Цитата Сообщение от vadim23409 Посмотреть сообщение
пишут, что эта цифра (write(f,i,ВОТ ТУТ ОНА) это размер переменной в байтах
По приведенной тобой ссылке речь идет о BlockRead/Write, а не о Read/Write

И параметром передается вовсе не целочисленная переменная (как у тебя), а переменная типа массив, размер которой собственно и передается следующим параметром.
0
Житель Земли
3003 / 3008 / 391
Регистрация: 26.07.2011
Сообщений: 11,464
Записей в блоге: 1
26.03.2014, 11:41 6
Цитата Сообщение от vadim23409 Посмотреть сообщение
write(f, i, 100);
НАЧНЕМ С ТОГО ЧТО ДАННАЯ КОНСТРУКЦИЯ ВЫЗЫВАЕТ ОШИБКУ
[Error] Unit1.pas(30): E2010 Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'Integer'
НУ А ПРОДОЛЖАТЬ, ДУМАЮ, НЕ СТОИТ
0
6 / 6 / 2
Регистрация: 24.09.2012
Сообщений: 381
26.03.2014, 12:22  [ТС] 7
тогда как написать сохранение/открытие? Пример кода напишите пожалуйста.
0
Почетный модератор
64304 / 47599 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.03.2014, 12:33 8
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Пример
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
type
TMapObject=record
    positionX:integer;
    positionY:integer;
 
  end;
 
 
var
  Form1: TForm1;
  f:file;
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var z:TMapObject;
    i:byte;
begin
randomize;
assignfile(f,'111');
rewrite(f,sizeof(TMapObject));
for i:=1 to 5 do
 begin
  z.positionX:=random(800);
  z.positionY:=random(800);
  blockwrite(f,z,1)
 end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var z:TMapObject;
begin
assignfile(f,'111');
reset(f,sizeof(TMapObject));
while not eof(f) do
 begin
  blockread(f,z,1);
  Memo1.Lines.Add(inttostr(z.positionX));
  Memo2.Lines.Add(inttostr(z.positionY));
 end;
end;
1
6 / 6 / 2
Регистрация: 24.09.2012
Сообщений: 381
26.03.2014, 12:43  [ТС] 9
это только для структуры, но нужно сначала, например, 2 переменные integer, а дальше массив структур, а то, что вы написали как пример, можно и через f:file of Tmapobject сделать
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.03.2014, 12:59 10
Цитата Сообщение от vadim23409 Посмотреть сообщение
нужно сначала, например, 2 переменные integer
И в чем проблема ?

i := SizeOf(TMapObject);
WriteBlock(f, i, SizeOf(i));

А вообще такие вещи удобнее и концептуально правильнее реализовывать с использованием готовых механизмов маршаллинга.
Вполне подходит стандартный встроенный механизм Delphi Streaming System
0
6 / 6 / 2
Регистрация: 24.09.2012
Сообщений: 381
26.03.2014, 13:13  [ТС] 11
Delphi
1
2
3
4
5
6
7
8
9
  assignfile(unit1.ProjectFile, GetCurrentDir+'\project\project.mpf');
  rewrite(unit1.ProjectFile,sizeof(unit1.points_array_count));
  write(unit1.ProjectFile,unit1.points_array_count);
  rewrite(unit1.ProjectFile,sizeof(unit1.MapObjects));
  for i:= 0 to unit1.points_array_count do
  begin
    write(unit1.ProjectFile,unit1.MapObjects[i]);
  end;
  closefile(unit1.ProjectFile);
и что? пишет только последний массив, стирая первую переменную! Вот проблема

Добавлено через 59 секунд
перезапись идёт 2 раза, сам знаю, но никто не может нормальный код скинуть
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.03.2014, 13:26 12
Цитата Сообщение от vadim23409 Посмотреть сообщение
перезапись идёт
Включи наконец мозг - перезапись инициируешь ты сам своими ручками:

rewrite(..); // очистил файл, т.е. подготовил к перезаписи
write(..); // записал что-то там в начало файла
rewrite(..); // опять очистил файл, уничтожив все что уже туда понаписал, подготовил к перезаписи
for .. to ..do
begin
write(..); // понаписал в начало файла еще что-то

Добавлено через 2 минуты
В чем вообще прелесть использования инструментов доступа к файлам времен царя Гороха ?)
Воспользуйся в конце-концов TFileStream'ом - с ним все проще, шустрее, нагляднее и надежней
0
6 / 6 / 2
Регистрация: 24.09.2012
Сообщений: 381
26.03.2014, 17:05  [ТС] 13
Цитата Сообщение от mss Посмотреть сообщение
Воспользуйся в конце-концов TFileStream'ом - с ним все проще, шустрее, нагляднее и надежней
Никогда раньше с ним не работал, но вот:
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
var Mapobjects: array of Tmapobject;
 
procedure saveproject;
var i:integer;
Stream: TFileStream;
begin
  try
     Stream := TFileStream.Create(GetCurrentDir+'\project\project.mpf', fmOpenReadWrite);
   except
     Stream := TFileStream.Create(GetCurrentDir+'\project\project.mpf', fmCreate);
   end;
   points_array_count:=length(unit1.MapObjects);
   stream.WriteBuffer(points_array_count, sizeof(points_array_count));
   for I := 0 to points_array_count-1 do
   begin
      stream.WriteBuffer(unit1.MapObjects[i],sizeof(unit1.TMapObject));
   end;
    stream.Free;
end;
 
 
procedure LOADPROJECT;
var i:integer;
Stream: TFileStream;
begin
  try
     Stream := TFileStream.Create(GetCurrentDir+'\project\project.mpf', fmOpenRead);
   except
     MessageBox(application.handle,Pchar('fail'),Pchar('Error'),MB_ICONERROR); 
     Exit;
   end;
   Stream.ReadBuffer(points_array_count, sizeof(points_array_count));
   setlength(unit1.MapObjects,points_array_count);
   for I := 0 to points_array_count-1 do
   begin
      stream.ReadBuffer(unit1.MapObjects[i],sizeof(unit1.TMapObject));
   end;
end;
В файл пишет, но открывать не хочет(

Добавлено через 14 минут
уже работает, спасибо...
0
26.03.2014, 17:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2014, 17:05
Помогаю со студенческими работами здесь

Не могу записать в нетипизированный файл
Добрый вечер! Пытаюсь записать в нетипизированный файл, и получаю ошибку Uknown Run-Time...

Deflate Algorithm. Прочитать нетипизированный файл
Всем привет. Вот тут прога файлы шифрует, хочу его прочитать. Байты: 0..3 - Width (4 bytes) 4..7...

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

Поиск и замена данных (Нетипизированный файл)
Поковырялся я на этом форуме, в инете, но нечего понятного найти не смог. Кто нибудь может...


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

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