ПредишенСледващото

Как да запазите файл и изтеглете файла от безразмерна масив

Предмет.
При зареждане на масива е неизвестен. Как да запазите файл в масив с информация за величина и да го заредите от там, до размера на масива е създадена така, както беше, когато ви спести?

запишете първата измерение, а след това на самия масив.

но като цяло за четене / запис опит за / от файл (а) ли?

> По партидата, заедно с информация за размера

т.е. например да се създаде FILESTREAM първи размер на запис
Дължина (Array), SizeOf (цяло число)), след което се масив или елементи или просто цялата единица

Не можете да четете елементите INF-ТА на размери в променлива масив.
и след това, преди да го съхраните истинския файл данни, пишете на файл стойностите на тези променливи.
така че, когато четете от файл, за да зададете размера на sootv.obrazom масива преди да сте прочели масива след преминаване към истинския файл данни.

Той има същата Fct TVarData, VarArrayDimCount (), VarArrayLow / HighBound () и така нататък.
те ще предоставят INF-• за структурата на масива, за да се спаси / прочети това може да се възстанови структурата на възстановената масив тривиално предизвикателството VarArrayCreate ()

В държавата. Но аз мисля, че има по-лесен начин, и си помислих, че тъй като мисля, че ще направим, е слаб.

Все пак реших да се опитам да не се съхранява отделно в променлив брой на файла. записи. Написа тук е нещо, но тя не работи. Не мога да разбера какво става.


тип
InfoNode = рекорд
майка: цяло число;
ФАЙЛНОМ: кардинална;
текст: низ [120];
приключи;
.

NodeList: масив от InfoNode;
.

// Запис на списъка на възли в масива и след това във файл
процедура TForm1.NodeSave;
Var
е: файл;
и, к: цяло число;
започвам
к: = TreeView1.Items.Count;
SetLength (nodelist, к); // броят на възлите в Пример - 11
защото: = 0 до К-1 направи
започвам
с Treeview1.items.Item [Ь] направи
започвам
ако майка = нула след nodelist [Ь] .Parent: = 99999999 друго
nodelist [Ь] .parent: = parent.absoluteindex;
nodelist [Ь] .text: = текст;
nodelist [Ь] .fileNum: = кардинална (данни);
приключи;
приключи;
RichEdit1.lines.add (inttostr (sizeof (nodelist))); // Тук ние виждаме 4
RichEdit1.lines.add (inttostr (TreeView1.items.count)); // въпреки че 11

assignfile (е "nodelist.dat");
презапис (е, 128);
blockwrite (е, nodelist, к);
closefile (е);
приключи;

// Load от файл
процедура TForm1.NodeLoad;
Var
е: файл;
започвам
assignfile (е "nodelist.dat");
нулиране (е, 128);
SetLength (nodelist, FileSize (е));
blockread (е, nodelist, Размер (е));
RichEdit1.lines.add (inttostr (размер на файла (е))); // Тук ние виждаме 11
closefile (е);
RichEdit1.lines.add (nodelist [2] .text); // И тук е празен на възела, в текст, който беше.
приключи;

Все пак реших да се опитам да не се съхранява отделно в променлив брой на файла. записи. Написа тук е нещо, но тя не работи. Не мога да разбера какво става.


тип
InfoNode = рекорд
майка: цяло число;
ФАЙЛНОМ: кардинална;
текст: низ [120];
приключи;
.

NodeList: масив от InfoNode;
.

// Запис на списъка на възли в масива и след това във файл
процедура TForm1.NodeSave;
Var
е: файл;
и, к: цяло число;
започвам
к: = TreeView1.Items.Count;
SetLength (nodelist, к); // броят на възлите в Пример - 11
защото: = 0 до К-1 направи
започвам
с Treeview1.items.Item [Ь] направи
започвам
ако майка = нула след nodelist [Ь] .Parent: = 99999999 друго
nodelist [Ь] .parent: = parent.absoluteindex;
nodelist [Ь] .text: = текст;
nodelist [Ь] .fileNum: = кардинална (данни);
приключи;
приключи;
RichEdit1.lines.add (inttostr (sizeof (nodelist))); // Тук ние виждаме 4
RichEdit1.lines.add (inttostr (TreeView1.items.count)); // въпреки че 11

assignfile (е "nodelist.dat");
презапис (е, 128);
blockwrite (е, nodelist, к);
closefile (е);
приключи;

// Load от файл
процедура TForm1.NodeLoad;
Var
е: файл;
започвам
assignfile (е "nodelist.dat");
нулиране (е, 128);
SetLength (nodelist, FileSize (е));
blockread (е, nodelist, Размер (е));
RichEdit1.lines.add (inttostr (размер на файла (е))); // Тук ние виждаме 11
closefile (е);
RichEdit1.lines.add (nodelist [2] .text); // И тук е празен на възела, в текст, който беше.
приключи;

RichEdit1.lines.add (inttostr (sizeof (nodelist))); // Тук ние виждаме 4

Разберете защо и много ще стане ясно.

Аз предлагам да се предприемат всички ListBox или Memo. и след това се запазват данните по начин, Memo1.Lines.SaveToFile ( "1.TXT"); А Memo1.Lines.LoadFromFile натоварване ( "1.TXT"); След това погледнете броя на линиите в Memo - Memo1.Lines.Count (Толкова за дължината на масива). Аз почти винаги правя, когато имам масива трябва да бъде създаден динамично или неизвестен дължина.

Така че всъщност трябва да направя, и аз питам за вашата помощ.

Четох, че има SizeOf

Дължина (nodelist) - дължина на масива (11)
Дължина (nodelist) * sizeof (InfoNode) - размер на масива

Така че всъщност аз също може да бъде пренаписана, използвайки всички четене, readln, пишете writeln и работа с текстов файл.
Но IMHO Имам проблем е фактът, че масивът динамичен, тъй като такива масиви не съм пробвал да работят. И да напиша нещо като NodeList: масив [0..10000] от InfoNode; къде да декларира масив от броя. елементи, които със сигурност ще надхвърлят желаната стойност, аз някак си не харесвам.
Освен това, аз искам да знам, че аз все още съм тук, не е като "namutil".

TFileStream, TWriter + TWriter.WriteListBegin + TWriter.WriteListEnd + техники за запис на различни видове данни в TWriter
+ обхождане на масив

След това създайте бележка или ListBox също динамично и вложки и изтрива всичко, което искате. Този разтвор е подходящ?

assignfile (е "nodelist.dat");
презапис (е);
blockwrite (е, nodelist [0], Дължина (nodelist) * sizeof (InfoNode));
closefile (е);

assignfile (е "nodelist.dat");
SetLength (nodelist, FileSize (е) DIV sizeof (InfoNode));
blockread (е, nodelist [0], Размер (е));
closefile (е);

assignfile (е "nodelist.dat");
нулиране (е);
SetLength (nodelist, FileSize (е) DIV sizeof (InfoNode));
blockread (е, nodelist [0], Размер (е));
closefile (е);


> Аз предлагам да се предприемат всички ListBox или Memo, а след това
> Поддържане на техните данни така Memo1.Lines.SaveToFile ( "1.TXT");
> Натоварване Memo1.Lines.LoadFromFile ( "1.TXT"); след това погледнете
> Брой редове в Memo - Memo1.Lines.Count (толкова много за ДЪЛЖИНА
> Твърдо вещество). Аз почти винаги правя, когато имам набор от
> Трябва ли да се създават динамично или неизвестен дължина

Може би щеше да е по-удобни Tstrings zayuzat :)
И аз не се опитвам :)

процедура ReadFile;
Var Данни: масив от Trecord;
е: файл на TRecord;
ите: низ;
I, п: цяло число;
започвам
S: = "г: \ Data.dat";
AssignFile (F, S);
Пренаписване (е);
I: = FileSize (е); // дължина на масив;
п: = 0;
SetLength (Data, и);
Докато не EOF (е) направи
започвам
Вижте (е, данните [п]);
Inc (п);
приключи;
CLoseFile (е);
//.
//.
SetLength (данните, 0);
приключи;

процедура SaveFile;
Var Данни: масив от Trecord;
е: файл на TRecord;
ите: низ;
I, п: цяло число;
започвам
S: = "г: \ Data.dat";
AssignFile (F, S);
Reset (е);
защото: = Low (данни) за високо (данни) пишат (е, данни [Ь]);
CLoseFile (е); // Това "Всичко :)
приключи;

Благодаря. Да го получа. Въпреки, че по някаква причина, когато кодът Ви е настроен, след като изляза на грешката.
Пренаписан като:

тип
InfoNode = рекорд
майка: цяло число;
ФАЙЛНОМ: кардинална;
текст: низ [116]; // намалява до 116 sizeof (infonode) = 128
приключи;

// Record
assignfile (е "nodelist.dat");
презапис (е, 128);
blockwrite (е, nodelist [0], продължителност (NodeList));
closefile (е);

// четене
assignfile (е "nodelist.dat");
нулиране (е, 128);
SetLength (nodelist, FileSize (е));
blockread (е, nodelist [0], Размер (е));
closefile (е);

Чрез моя алгоритъм mozhesh макар низ [255]

assignfile (е "nodelist.dat");
презапис (F, 1);
blockwrite (е, nodelist [0], Дължина (nodelist) * sizeof (InfoNode));
closefile (е);

assignfile (е "nodelist.dat");
нулиране (F, 1);
SetLength (nodelist, FileSize (е) DIV sizeof (InfoNode));
blockread (е, nodelist [0], Размер (е));
closefile (е);

тип
InfoNode = рекорд
майка: цяло число;
ФАЙЛНОМ: кардинална;
текст: низ [116]; // намалява до 116 sizeof (infonode) = 128
приключи;

Въпреки, че има един въпрос. Като цяло число и кардинална вземат 4 байта, общо 4 + 4 + 116 = 124, и sizeof (infonode) = 128.

само
assignfile (е "nodelist.dat");
презапис (е, sizeof (InfoNode)); // -.
blockwrite (е, nodelist [0], продължителност (NodeList));
closefile (е);

презапис (F, 1);
нулиране (F, 1);

М Da. Забравих, че ще има 128 по подразбиране.

Е, това не е проблем.
Аз не съм опитвал, но аз мисля, че може да бъде толкова:
нулиране (е, sizeof (infonode));

Между другото, ако ви спести
blockwrite (е, Стрелката (цяло число (nodelist [0]) - 4), дължина (NodeList) 4); в писмената и дължината на файла на масива.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!