Vidutinio dispersijos formulė. Atsitiktinio dydžio lūkestis ir dispersija

Iki šiol svarstyti pavyzdžiai parodė suformatuotą informacijos įvedimą / išvedimą į failus. Skaičių formatuotą failų įvedimą/išvedimą patartina naudoti tik tada, kai jų dydis ir kiekis yra nedideli, taip pat kai reikia suteikti galimybę peržiūrėti failus neprograminėmis priemonėmis. Kitu atveju, žinoma, daug efektyviau naudoti dvejetainį I/O, kuris saugo skaičius taip pat, kaip ir kompiuterio OP, o ne kaip simbolių eilutes. Leiskite jums priminti, kad sveikasis skaičius (int) arba realus (slankioji) reikšmė atmintyje užima 4 baitus, dviguba reikšmė - 8 baitus ir simbolinę reikšmę tipo char- 1 baitas. Pavyzdžiui, skaičius 12345 tekstiniame (suformatuotame) faile užima 5 baitus, o dvejetainėje – 4 baitus.

Dvejetainiai failai, t.y. failus, kuriuose saugoma informacija vidinė forma atvaizdai naudojami vėlesniam programinės įrangos naudojimui ir negali būti peržiūrimi ne programine įranga. Dvejetainių failų privalumas yra tas, kad, pirma, skaitant/rašant, negaištamas laikas konvertuojant duomenis iš simbolinės vaizdavimo formos į vidinę ir atvirkščiai, antra, neprarandamas tikslumas. realūs skaičiai. Tiek suformatuoto įvesties/išvesties atveju, tiek dvejetainio įvesties/išvesties atveju, norint „teisingai“ apdoroti informaciją iš failo, reikia žinoti, kokių tipų duomenys, kaip ir kokia seka įrašomi į dvejetainį. failą, ypač todėl, kad dvejetainio failo peržiūra naudojant teksto rengyklę nieko nepadarys.

Panagrinėkime pavyzdį, kuris parodo sveikųjų dinaminio masyvo elementų įrašymą į dvejetainį failą ir jų nuskaitymą iš šio failo.

#įtraukti

#įtraukti

#įtraukti

naudojant vardų erdvę std;

cout<< "Vvedite kol-vo elementov celochisl. massiva: "; cin >> N;

int *mas = naujas int [N];

for(i=0; i

cout<< " Vvedite " << i << "-i element: "; cin >> mas[i];

cout<< "\nIdet zapis dannyh v fail..." << endl;

ofstream fout("c:\\os\\bin.dat", ios::binary);//sukūrė išeiti dvejetainis srautas

if(!fout) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

fout.write(reinterpret_cast (mas), N*sizeof(int));//įrašyti masyvą į failą

fout.close();//uždarant srautą

cout<< "Dannye uspeshno zapisany!" << endl;

for(i=0; i

ifstream fin("c:\\os\\bin.dat", ios::binary); //sukurkite giją, kad galėtumėte skaityti failą

if(!fin) ( cout<< "\n Oshibka otkrytiya faila!"; getch(); return 1; }

cout<< "Fail sodergit:" << endl;

fin.read(reinterpret_cast (mas), N*sizeof(int));//skaitykite masyvą iš failo

for(i=0; i

getch(); grąžinti 0;

Šioje programoje ypatingas dėmesys turėtų būti skiriamas write() (ofstream klasės metodas) ir read() (ifstream klasės metodas) funkcijų naudojimui. Šios funkcijos galvoja apie duomenis baitais ir yra skirtos perkelti tam tikrą skaičių baitų iš duomenų buferio į failą ir atgal. Šių funkcijų parametrai yra buferio adresas ir jo ilgis baitais.

Funkcija write() skirta įrašyti į failą antrajame parametre nurodytą baitų skaičių nuo nurodytų pirmame parametre adresus duomenų buferis, o funkcija read() skirta nuskaityti duomenis iš failo. Reikėtų pažymėti, kad šios funkcijos veikia tik su char tipo duomenų buferiu. Šiuo atžvilgiu šioje programoje naudojome operatorių reinterpret_cast<> kuri paverčia mūsų int (mas) tipo duomenų buferį į char tipo buferį.

Svarbu atsiminti, kad liejimas naudojant operatorių reinterpret_cast būtinas tik tais atvejais, kai pirmasis funkcijų parametras rašyti () Ir skaityti () nėra simbolių masyvas (galų gale, tipo simbolis char užima tik 1 baitą). Be to, jei reikia rašyti ar skaityti ne masyvą, o atskirus kintamuosius, tuomet reikia naudoti nuorodos mechanizmą (nuorodą į duomenų buferio adresą), pavyzdžiui:

ofstream fout(failo pavadinimas, ios::app | ios::binary);

fout.write(reinterpret_cast (& cb), dydisof(plūdė));

Dabar reikia aptarti antrąjį nagrinėjamų funkcijų parametrą. Šioje programoje kaip antrą parametrą naudojome išraišką N*sizeof(int), su kuria apskaičiavome baitų skaičių. Pavyzdžiui, jei turime 5 sveikųjų skaičių masyvo elementus, tai baitų skaičius bus 20. Funkcija sizeof() grąžina baitų skaičių, skirtą duomenų tipui, nurodytam kaip parametras. Pavyzdžiui, sizeof( tarpt) grįš 4.

Taigi, šiame pavyzdyje pateikta programa leidžia įrašyti duomenis dvejetaine forma į bin.dat failą ir nuskaityti iš šio dvejetainio failo. Be to, perskaičius šie duomenys konvertuojami į int tipą, įgauna masyvo struktūrą ir su jais galima atlikti bet kokias operacijas.

Dabar įsivaizduokite, kad jums reikia parašyti programą, kuri leistų nuskaityti duomenis iš failo bin.dat, ir mes žinome tik tai, kad šiame faile yra dvejetainės formos sveikųjų skaičių masyvo elementai. Parašytų elementų skaičius ( N ) nežinome. Kurdami programą neturime teisės naudoti pastovaus masyvo, t.y. paskirstykite jam atmintį programos kūrimo etape. Tai sukels klaidingą rezultatą. Dėl per mažos N reikšmės nebus skaičiuojami visi masyvo elementai, o dėl per didelės N reikšmės papildomi langeliai bus užpildyti atsitiktinėmis reikšmėmis.

Panagrinėkime programos pavyzdį, leidžiančią iš dvejetainio failo nuskaityti sveikųjų skaičių masyvo elementus, dinamiškai paskirstant atmintį, o norint įrodyti nuskaitytų duomenų tikroviškumą, apskaičiuokite jų sumą.

#įtraukti

#įtraukti

#įtraukti

naudojant vardų erdvę std;

int N, i, suma=0, dfb; //dfb – failo ilgis baitais

ifstream fin("c:\\os\\bin.dat", ios:: dvejetainis);

if(!fin) ( cout<< "Oshibka otkrytiya faila!"; getch(); return 1; }

fin.seekg(0, ios::pabaiga);//nustatyti skaitymo padėtį į failo pabaigą (0 baitų nuo pabaigos)

dfb = fin.tellg();//gauti failo pabaigos pozicijos reikšmę (baitais)

N = dfb/4;//žinant, kad sveikasis skaičius užima 4 baitus, apskaičiuokite skaičių skaičių

int *arr = naujas int [N];//sukurti dinaminį masyvą

fin.seekg(0, ios::beg);//prieš skaitydami duomenis, perkelkite dabartinę padėtį į failo pradžią

fin.read(reinterpret_cast (arr), dfb);

cout<< "Iz faila schitano " << N << " elementov:" << endl;

for(i=0; i

for(i=0; i

cout<< "\n Ih summa = " << sum;

getch(); grąžinti 0;

Pažvelkime atidžiau į šią programą, kurioje aktyviai naudojome seekg() ir tellg() funkcijas, kurios yra ifstream klasės metodai. Čia reikėtų pažymėti, kad Bet koks failas, kai jis atidaromas, yra susietas su vadinamąja dabartine skaitymo arba rašymo padėtimi. Kai failas atidaromas skaityti, ši numatytoji padėtis nustatoma į failo pradžią. Tačiau gana dažnai reikia rankiniu būdu valdyti padėtį, kad būtų galima skaityti ir rašyti pradedant nuo savavališkos failo vietos. Funkcijos seekg () ir tellg () leidžia nustatyti ir patikrinti esamą skaitymo žymeklį, o funkcijos seekp () ir tellp () daro tą patį rašymo žymekliui.

Metodas seekg(1_parameter, 2_parameter) perkelia dabartinę skaitymo vietą iš failo baitų skaičiumi, nurodytu 1_parameter, palyginti su vieta, nurodyta 2nd_parameter. 2_parameter gali turėti vieną iš trijų reikšmių:

ios::beg – nuo ​​failo pradžios;

ios::cur – nuo ​​dabartinės padėties;

ios::end – nuo ​​failo pabaigos.

Čia beg, cur ir end yra konstantos, apibrėžtos ios klasėje, o simboliai:: reiškia prieigos prie šios klasės operaciją. Pavyzdžiui, operatorius fin.seekg(-10, ios::end); leidžia nustatyti dabartinę failo skaitymo vietą iki 10 baitų prieš failo pabaigą.

Dabar grįžkime prie programos veikimo aprašymo. Remdamiesi tuo, kad nežinome į failą įrašytų skaičių skaičiaus, pirmiausia turime išsiaiškinti skaičių skaičių. Norėdami tai padaryti, naudodami fin.seekg(0, ios::pabaiga); pereiname į failo pabaigą ir naudodamiesi funkcija tellg() grąžiname dfb kintamajam failo ilgį baitais. Funkcija tellg() grąžina esamą žymeklio padėtį baitais. Kadangi žinome vieno sveikojo skaičiaus ilgį baitais (4 baitai), nesunku apskaičiuoti į failą įrašytų skaičių skaičių, žinant failo ilgį baitais ( N = dfb/4;). Išsiaiškinę skaičių skaičių, sukuriame dinaminį masyvą ir pereiname į failo pradžią, kad pradėtume skaityti duomenis naudodami read() funkciją. Nurodytą duomenų baitų skaičių (dfb) perkėlus į duomenų buferį (arr), tokiu būdu nuskaityti duomenys įgauna masyvo struktūrą ir tampa visiškai tinkami bet kokioms kodo operacijoms ir transformacijoms.

Aukščiau pateiktame pavyzdyje „ilgiausia“ parinktis yra „b“: jai reikalingi 23 baitai (21 baitas eilutei ir 2 baitai sveikajam skaičiui). Parinktys "n" ir "m" reikalauja atitinkamai 4 ir 5 baitų (žr. lentelę).

pavadinimas, leidėjo prekė Varianto dalis

Dvejetainiai failai

Dvejetainiai failai saugo informaciją tokia forma, kokia ji pateikiama kompiuterio atmintyje, todėl yra nepatogūs žmonėms. Žiūrint į tokį failą neįmanoma suprasti, kas jame parašyta; jo negalima sukurti ar taisyti rankiniu būdu – tam tikrame teksto rengyklėje – ir pan. Tačiau visus šiuos nepatogumus kompensuoja darbo su duomenimis greitis.

Be to, tekstiniai failai klasifikuojami kaip nuoseklios prieigos struktūros, o dvejetainiai failai – kaip tiesioginės prieigos struktūros. Tai reiškia, kad bet kuriuo metu galite pasiekti bet ką, o ne tik dabartinį dvejetainio failo elementą.

Įvesti failai

Struktūrinių duomenų tipų kintamieji (išskyrus eilutę) negali būti nuskaitomi iš tekstinio failo. Pavyzdžiui, jei reikia įvesti duomenis iš tekstinio failo, kad žaislo įrašas būtų užpildytas informacija apie parduodamus žaislus (produkto pavadinimas, produkto kaina ir amžiaus intervalas, kuriam žaislas skirtas):

amžius: rinkinys 0..18; (byle nurodyta pagal ribas)

tada turėsite parašyti šį kodą:

c:char; i,j,min,maks: sveikasis skaičius;

a: žaislų rinkinys;

pradėti priskirti(f,įvestis); atstatyti(f);

jei i:=1–100, darykite, jei ne eof(f)

tada su [i] padaryti

pradėti readln(f,pavadinimas,kaina,min,maks.); amžius:=;

j:= nuo min iki maks. do amžius:=amžius+[j];

Kaip matote, toks skaitymas po elemento yra labai nepatogus ir daug darbo reikalaujantis.

Siūloma išeitis iš šios situacijos įvestus failus- jų elementai gali priklausyti bet kuriam pagrindiniam arba struktūriniam duomenų tipui. Vienintelis apribojimas yra tas, kad visi elementai turi būti to paties tipo. Šis akivaizdus nepatogumas yra

būtina sąlyga norint organizuoti tiesioginę prieigą prie dvejetainio failo elementų: kaip ir masyvų atveju, jei tiksliai žinomas kiekvieno struktūros komponento ilgis, bet kurio komponento adresą galima apskaičiuoti naudojant labai paprastą formulę:

<начало_структуры> + <номер_компонента>*<длина_компонента>

Įvestų failų aprašymas

Skiltyje var yra failų kintamieji, skirti dirbti įvestus failus, aprašomi taip:

var<файловая_перем>: failas iš<тип_элементов_файла>;

Jokio failo kintamojo negalima nurodyti kaip konstantą.

Įvesto failo paskirtis

Nuo šiol iki skyriaus pabaigos žodžiu „failas“ turėsime omenyje „ dvejetainio tipo failą“ (žinoma, jei konkrečiai nenurodyta kitaip).

Komanda priskirti (f,"<имя_файла>"); padeda užmegzti ryšį tarp failo kintamasisf ir failo, už kurio veikimą šis kintamasis bus atsakingas, pavadinimo.

eilutė"<имя_файла>" gali būti visas failo kelias. Jei kelias nenurodytas, laikoma, kad failas yra tame pačiame kataloge kaip ir programos vykdomasis modulis.

Įvesto failo atidarymas ir uždarymas

Priklausomai nuo to, kokius veiksmus programa atliks atidarydama failą, jį galima atidaryti dviem būdais:

atstatyti(f); - failo atidarymas norint nuskaityti iš jo informaciją ir tuo pačiu į jį įrašyti (jei tokio failo nėra, bandymas jį atidaryti sukels klaidą). Ta pati komanda naudojama norint grąžinti žymeklį į failo pradžią;

perrašyti(f); - atidaryti failą, kad būtų galima įrašyti informaciją; jei tokio failo nėra, jis bus sukurtas; jei failas tokiu pat pavadinimu jau yra, visa jame anksčiau buvusi informacija išnyks.

Užsidaro įvestus failus procedūra close(f) , bendra visiems failų tipams.

Skaitymas iš įvesto failo

Skaitymas iš failo, kuris yra atidarytas skaitymui, atliekamas naudojant read() komandą. Skliausteliuose pirmiausia nurodomas failo kintamojo pavadinimas, o tada įvesties sąrašas1) :

Iš failo galite įvesti tik deklaraciją atitinkančio tipo kintamuosius, tačiau šis duomenų tipas taip pat gali būti struktūrizuotas. Tarkime, jei grįšime prie pastraipos pradžioje pateikto pavyzdžio. Įvesti failai“, taps akivaizdu, kad naudojimas įvestą failą Vietoj teksto žymiai sumažins programos tekstą:

tipo žaislas = įrašo pavadinimas: eilutė; kaina: tikra;

amžius: rinkinys 0..18; (nustatyta ribomis)

var f: žaislo failas;

a: žaislų rinkinys; pradėti

priskirti(f,įvestis);

i:=1 iki 100 daryti

jei ne eof(f), tada skaitykite (f,a[i]); uždaryti(f);

Ieškokite įvestame faile

Mums jau pažįstama funkcija eof(f:file):boolean praneša, kada pasiekiama failo pabaiga. Visos kitos „paieškos pabaigos“ funkcijos (eoln(), seekeof() ir seekeoln()), būdingos tekstiniams failams, negali būti taikomos įvestiems failams.

Tačiau yra specialių paprogramių, su kuriomis galite dirbti įvestus failus kaip ir naudojant tiesioginės prieigos struktūras:

1. Funkcija filepos(f:file):longint praneš apie esamą žymeklio padėtį failef. Jei ji nurodo į patį failo, kuriame yra N elementų, pabaigą, ši funkcija pateiks rezultatą N . Tai paaiškinti nesunku: failo elementai numeruojami pradedant nuo nulio, todėl paskutinis elementas numeruojamas N-1. Taigi skaičiusN priklauso „neegzistuojančiam“ elementui - failo pabaigos ženklui.

2. Funkcija fileize(f:file):longint apskaičiuos failo ilgį f .

3. Procedūra seek(f:file,n:longint) perkels žymeklį faile f į įrašo numerio N pradžią. Jei paaiškėja, kad n yra didesnis nei tikrasis failo ilgis, žymeklis bus perkeltas už tikrojo failo pabaigos.

4. Procedūra truncate(f:file) apkarpys failo "uodegą": visi elementai nuo dabartinės iki failo pabaigos bus pašalinti iš jo. Tiesą sakant, tik „failo pabaigos“ ženklas bus perrašytas į vietą, kur nukreipė žymeklį, o fiziškai „nupjautos“ reikšmės išliks pradinėse vietose - jos tiesiog taps „našlaičiais“.

Rašymas į įvestą failą

Galite įrašyti kintamuosius faile, kuris yra atidarytas rašymui, naudodami komandą write (). Kaip ir skaitymo atveju, pirmiausia pateikiamas failo kintamasis, o po to – išvesties sąrašas:

rašyti(f,a,b,c); - įrašyti į filef (anksčiau atidarytas rašymui komandomis rewrite(f) arba reset(f) ) kintamieji a, b, c.

Išvestis į įvestą failą Leidžiami tik kintamieji, kurie atitinka duomenų tipo aprašymą. Neįvardytų ir neįvestų konstantų spausdinti negalima

įvestą failą.

Įvesti failai yra laikomos ir tiesioginės, ir nuoseklios prieigos struktūromis. Tai reiškia, kad rašyti galima ne tik pačioje failo pabaigoje, bet ir bet kuriame kitame elemente. Parašyta reikšmė pakeis ankstesnę šio elemento reikšmę (senoji reikšmė bus „perrašyta“).

Pavyzdžiui, jei jums reikia pakeisti penktą failo elementą reikšme, saugoma kintamajame a, tuomet turėtumėte parašyti šią programos ištrauką:

ieškoti(f,5); (žymiklis bus nustatytas į 5-ojo elemento pradžią)

rašyti(f,a); (žymiklis bus nustatytas į 6-ojo elemento pradžią)

Daugeliui žmonių dažnai kyla klausimų, kaip atidaryti dvejetainį failą. Šis dokumentas yra bet koks failas, esantis asmeniniame kompiuteryje. Visi duomenys, esantys kompiuteriuose ir su jais susijusiose laikmenose, paprastai įrašomi bitais. Iš šio žodžio ir kilo pavadinimas. Jei palyginimui naudosite paprastą tekstinį failą, jį skaitant nebus jokių problemų. Norėdami tai padaryti, pakanka turėti įprastą redaktorių savo kompiuteryje. Norėdami atidaryti dvejetainį failą, negalėsite naudoti paprasto bloknoto. Ir jei mes kalbame apie tai, kad informacija tekstiniuose failuose yra užšifruota tais pačiais bitais, tada paprastai, kai kalbama apie dvejetainių failų skaitymą, jie turi omenyje vykdomuosius dokumentus.

Veiksmų instrukcijos

Pirmiausia turite įdiegti programinės įrangos įrankį HexEditor, kuris yra paprastas dvejetainių failų redaktorius, asmeninio kompiuterio standžiajame diske. Įdiegę programą reikia atidaryti dukart spustelėjus piktogramą. Šis įrankis leis jums nuskaityti dvejetainį failą realiuoju režimu. Tokiu atveju galite keisti failo duomenis, pridėti savo informaciją ir pan. Norėdami dirbti su šiuo redaktoriumi ir modifikuoti dvejetainį failą, turite turėti bent šiek tiek žinių šioje veiklos srityje.

Antra, reikia susipažinti su jo pagrindiniu langu, kuris mažai kuo skiriasi nuo įprasto redaktoriaus lango. Tie patys mygtukai, tas pats meniu, dokumento turinys, žymės ir būsenos juostos. Galite atidaryti dominantį failą skirtuke Failas arba naudodami specialų mygtuką, esantį programoje. Po to galėsite matyti vykdomąjį failą, kuris bus rodomas skaičių ir raidžių pavidalu. Neturėtumėte painioti simbolių, su kuriais vaizduojamas dvejetainis failas, ir tų, kuriuos turi įprastas redaktorius. Priėmus sprendimą ištrinti ar pakeisti kurią nors dokumento dalį, reikia suprasti, kad dalis jos išnyks arba pasikeis.

Trečia, naudodamiesi programa galite pabandyti pakeisti bet kurią dokumento dalį. Kaip minėta anksčiau, programinės įrangos įrankis rodo failą taip, kad būtų lengviau rasti reikiamą dokumento dalį. Be to, programos konfigūracija yra gana lanksti. Su jo pagalba galite pakeisti dvejetainio kodo, kuriame yra dvejetainis failas, grafinį vaizdą. Jei į kurią nors failo dalį įvedami neteisingi duomenys, vėliau ji gali visiškai nustoti veikti arba pradėti veikti netinkamai. Bet kokiu atveju tokių duomenų įvedimas sukels pokyčius tiek operacinėje sistemoje, tiek tiesiogiai pačiame asmeniniame kompiuteryje.

Ketvirta, pakeitę, ištrynę ar įtraukę tam tikrus duomenis faile, turėtumėte išsaugoti savo darbo rezultatą. Jei neturite pakankamai patirties redaguojant failus, turėtumėte būti pasirengę ne visai malonioms pasekmėms. Pavyzdžiui, dokumentas gali nustoti veikti pasikeitus duomenims. Kol nepradėsite gerai suprasti šios problemos, bus sugadinta daug failų kopijų. Jei nesate tikri savo galimybėmis, neturėtumėte patys keisti duomenų, ypač tais atvejais, kai reikia taisyti antrinį failą.



Ar jums patiko straipsnis? Pasidalinkite su draugais!