Hogyan kell menteni a fájlt, és töltse le a fájlt egy dimenzió nélküli tömb
Hogyan kell menteni a fájlt, és töltse le a fájlt egy dimenzió nélküli tömb
Tárgy.
Betöltésekor a tömb ismeretlen. Hogyan mentse el a fájlt egy tömb információkat dimenziót, majd töltse be onnan, hogy a méret a tömb alakult úgy, ahogy volt, amikor ment?
mentse az első dimenzió, majd magát a tömböt.
de általában a felvétel / olvasási élményt / egy fájl (ok) van?
> A fájlban információkkal együtt a dimenzió
azaz például, hogy hozzon létre egy FileStream első rekord méretű
Hossz (Array), sizeof (integer)), akkor a tömb maga, vagy az elemek, vagy csak a teljes egység
Nem tudja elolvasni az elemek inf-CIÓ dimenziók egy tömbben változó.
majd mielőtt tárolja az aktuális adatállomány, írni egy fájlt a e változók értékeit.
hogy amikor olvasni a fájlt beállítani a dimenzió a tömb sootv.obrazom olvasása előtt a tömb után megy a tényleges adatfájlt.
Ugyanaz a Fct TVarData, VarArrayDimCount (), VarArrayLow / HighBound (), és így tovább.
fognak nyújtani inf-CIÓ a szerkezet a tömb, annak érdekében, hogy mentse / olvasni képes helyreállítani a szerkezet a helyreállított tömb triviális kihívás VarArrayCreate ()
Az állam. De azt hiszem, hogy van egy könnyebb út, és úgy gondolta, hogy mivel azt hiszem, hogy köze van béna.
Mégis úgy döntöttem, hogy megpróbál nem külön-külön tároljuk változó számú fájl. nyilvántartást. Írtak itt van valami, de ez nem működik. Nem értem, mi folyik itt.
típus
InfoNode = rekord
szülő: integer;
FÁJLSZÁM: bíboros;
szöveg: string [120];
végén;
.
NodeList: tömb InfoNode;
.
// Save the csomópontok listáját a tömböt, majd egy fájlba
eljárás TForm1.NodeSave;
var
f: fájl;
i, k: integer;
kezdődik
k: = TreeView1.Items.Count;
SetLength (nodelist, k); // a csomópontok száma példa - 11
i: = 0 a k-1 do
kezdődik
A Treeview1.items.Item [i] do
kezdődik
ha szülő = nil majd nodelist [i] .PARENT: = 99999999 mást
nodelist [i] .PARENT: = parent.absoluteindex;
nodelist [i] .text: = szöveg;
nodelist [i] .fileNum: = bíboros (adatok);
végén;
végén;
RichEdit1.lines.add (inttostr (sizeof (nodelist))); // Itt látjuk 4
RichEdit1.lines.add (inttostr (TreeView1.items.count)); // bár 11
AssignFile (f, "nodelist.dat");
átírni (f, 128);
blockwrite (f, nodelist, k);
CloseFile (f);
végén;
// betöltése fájlból
eljárás TForm1.NodeLoad;
var
f: fájl;
kezdődik
AssignFile (f, "nodelist.dat");
reset (f, 128);
SetLength (nodelist, FileSize (f));
blockread (f, nodelist, Fájlméret (f));
RichEdit1.lines.add (inttostr (filesize (f))); // Itt látjuk 11
CloseFile (f);
RichEdit1.lines.add (nodelist [2] .text); // És itt üres csomóponthoz szöveg volt.
végén;
Mégis úgy döntöttem, hogy megpróbál nem külön-külön tároljuk változó számú fájl. nyilvántartást. Írtak itt van valami, de ez nem működik. Nem értem, mi folyik itt.
típus
InfoNode = rekord
szülő: integer;
FÁJLSZÁM: bíboros;
szöveg: string [120];
végén;
.
NodeList: tömb InfoNode;
.
// Save the csomópontok listáját a tömböt, majd egy fájlba
eljárás TForm1.NodeSave;
var
f: fájl;
i, k: integer;
kezdődik
k: = TreeView1.Items.Count;
SetLength (nodelist, k); // a csomópontok száma példa - 11
i: = 0 a k-1 do
kezdődik
A Treeview1.items.Item [i] do
kezdődik
ha szülő = nil majd nodelist [i] .PARENT: = 99999999 mást
nodelist [i] .PARENT: = parent.absoluteindex;
nodelist [i] .text: = szöveg;
nodelist [i] .fileNum: = bíboros (adatok);
végén;
végén;
RichEdit1.lines.add (inttostr (sizeof (nodelist))); // Itt látjuk 4
RichEdit1.lines.add (inttostr (TreeView1.items.count)); // bár 11
AssignFile (f, "nodelist.dat");
átírni (f, 128);
blockwrite (f, nodelist, k);
CloseFile (f);
végén;
// betöltése fájlból
eljárás TForm1.NodeLoad;
var
f: fájl;
kezdődik
AssignFile (f, "nodelist.dat");
reset (f, 128);
SetLength (nodelist, FileSize (f));
blockread (f, nodelist, Fájlméret (f));
RichEdit1.lines.add (inttostr (filesize (f))); // Itt látjuk 11
CloseFile (f);
RichEdit1.lines.add (nodelist [2] .text); // És itt üres csomóponthoz szöveg volt.
végén;
RichEdit1.lines.add (inttostr (sizeof (nodelist))); // Itt látjuk 4
Megérteni, miért és mennyi lesz világos.
Azt javaslom, hogy tegyen meg minden ListBox vagy Memo. majd mentse az adatokat oly módon Memo1.Lines.SaveToFile ( „1.txt”); A terhelés Memo1.Lines.LoadFromFile ( "1.txt"); Akkor nézd sorok száma Memo - Memo1.Lines.Count (Ennyit a hossza a tömb). Én szinte mindig tenni, amikor a tömb dinamikusan kell létrehozni, vagy ismeretlen hosszúságú.
Tehát valójában azt kell csinálni, és kérem a segítségét.
olvasni, hogy sizeof
Hossz (nodelist) - hossza a tömb (11)
Hossz (nodelist) * sizeof (InfoNode) - a tömb méretét
Tehát valójában azt is átírható minden olvasni, readln, ír, writeln és a munka egy szöveges fájlt.
De IMHO van egy probléma az, hogy a tömb dinamikus, mivel ilyen tömbök én még nem próbáltam dolgozni. És, hogy írjon valami hasonló NodeList: array [0..10000] A InfoNode; ahol egy tömböt a gróf. elemek, amelyek minden bizonnyal meghaladja a kívánt értéket, valahogy nem tetszett.
Ezen kívül, azt szeretném tudni, hogy még mindig itt vagyok nem a „namutil”.
TFileStream, TWriter + TWriter.WriteListBegin + TWriter.WriteListEnd + technikák rögzítése különböző típusú adatok TWriter
+ végighaladni a tömb
Ezután hozzon létre Memo vagy ListBox is dinamikusan és betétekkel és törli az összes tetszik. Ez az oldat alkalmas?
AssignFile (f, "nodelist.dat");
átírni (f);
blockwrite (F, nodelist [0], Hossz (nodelist) * sizeof (InfoNode));
CloseFile (f);
AssignFile (f, "nodelist.dat");
SetLength (nodelist, FileSize (f) div sizeof (InfoNode));
blockread (F, nodelist [0], Fájlméret (f));
CloseFile (f);
AssignFile (f, "nodelist.dat");
reset (f);
SetLength (nodelist, FileSize (f) div sizeof (InfoNode));
blockread (F, nodelist [0], Fájlméret (f));
CloseFile (f);
> Azt javaslom, hogy tegyen meg minden ListBox vagy Memo, majd
> Megtartják adatokat úgy, Memo1.Lines.SaveToFile ( "1.txt");
> A terhelés Memo1.Lines.LoadFromFile ( "1.txt"); akkor nézd
> A sorok száma a Memo - Memo1.Lines.Count (Ennyit HOSSZA
> Szilárd). Majdnem mindig, ha van egy sor
> Kell dinamikusan létrehozott vagy ismeretlen hosszúságú
Talán az lenne a kényelmesebb Tstrings zayuzat :)
És én nem próbálja meg :)
eljárás readfile;
var Adatok: kitűnő Trecord;
f: fájl TRecord;
s: string;
i, n: egész szám;
kezdődik
s: = "d: \ Data.dat";
AssignFile (F, S);
Átírni (f);
i: = FileSize (f); // hossza tömb;
n: = 0;
SetLength (Data, i);
Bár nem EOF (f) do
kezdődik
Read (F, Adat [n]);
Inc (n);
végén;
CloseFile (f);
//.
//.
SetLength (adatok, 0);
végén;
eljárás saveFile;
var Adatok: kitűnő Trecord;
f: fájl TRecord;
s: string;
i, n: egész szám;
kezdődik
s: = "d: \ Data.dat";
AssignFile (F, S);
Visszaállítása (f);
i: = Low (adatok) magas (adatok) do write (F, adatok [i]);
CloseFile (f); // Ez a „s all :)
végén;
Köszönöm. Értem. Bár valamilyen oknál fogva, amikor az be van állítva, akkor kapok ki a hibát.
Átírni:
típus
InfoNode = rekord
szülő: integer;
FÁJLSZÁM: bíboros;
szöveg: string [116]; // csökken 116 a sizeof (infonode) = 128
végén;
// Record
AssignFile (f, "nodelist.dat");
átírni (f, 128);
blockwrite (F, nodelist [0], hossza (NodeList));
CloseFile (f);
// Reading
AssignFile (f, "nodelist.dat");
reset (f, 128);
SetLength (nodelist, FileSize (f));
blockread (F, nodelist [0], Fájlméret (f));
CloseFile (f);
Az én algoritmus mozhesh bár string [255]
AssignFile (f, "nodelist.dat");
átírni (F, 1);
blockwrite (F, nodelist [0], Hossz (nodelist) * sizeof (InfoNode));
CloseFile (f);
AssignFile (f, "nodelist.dat");
reset (F, 1);
SetLength (nodelist, FileSize (f) div sizeof (InfoNode));
blockread (F, nodelist [0], Fájlméret (f));
CloseFile (f);
típus
InfoNode = rekord
szülő: integer;
FÁJLSZÁM: bíboros;
szöveg: string [116]; // csökken 116 a sizeof (infonode) = 128
végén;
Bár van egy kérdés. Mint egész szám, és kardinális vegye 4 bájt, összesen 4 + 4 + 116 = 124, és a sizeof (infonode) = 128.
csak
AssignFile (f, "nodelist.dat");
átírni (F, sizeof (InfoNode)); // -.
blockwrite (F, nodelist [0], hossza (NodeList));
CloseFile (f);
átírni (F, 1);
reset (F, 1);
M da. Elfelejtettem, hogy nem lesz 128 alapértelmezés szerint.
Nos, ez nem jelent problémát.
Még nem próbáltam, de azt hiszem, hogy nem lehet ennyire:
reset (F, sizeof (infonode));
By the way, ha menteni
blockwrite (F, Pointer (Egész szám (nodelist [0]) - 4), hosszúság (NodeList) +4); Az írásbeli és a fájl hossza a tömb.