Práca s textovými súbormi. Čítanie a zapisovanie súboru. Trieda FileStream

  • 09.10.2019

Už sme sa naučili zapisovať informácie do textového súboru. - Ak ste sa nepoučili, pozrite si posledný článok. Podrobne hovorí a popisuje

Čo však v prípade, ak súbor už existuje a potrebujeme z neho prečítať informácie na spracovanie? Našťastie je to tiež celkom jednoduché. Pripomínam, že na realizáciu tejto úlohy je viacero možností, opísal som len jednu z nich. Opísaný je ten, ktorý sa mi osobne z nejakého dôvodu zdá najľahší na vnímanie.

#include

int main ()
{
char s1 //Premenná prečíta reťazec
ifstream in („C: \\\ FromC \\ myfile.txt“); //Otvorenie súboru na prečítanie informácií
v >> s1; //prečítať riadok
v .close () // Zatvorte súbor

cout<Zobrazenie hodnoty s1 na obrazovke
návrat 0;
}

Tu je najjednoduchší program na čítanie prvého riadku z textového súboru umiestneného pozdĺž cesty
C: \\\ FromC \\ myfile.txt -
Keďže toto je pokračovanie minulého článku, rozhodol som sa použiť súbor, ktorý sme tam vytvorili. Pravdepodobne by s tým nemali byť žiadne ťažkosti.
Ale späť ku kódu. Najprv otvoríme súbor, aby sme si z neho prečítali informácie, na to použijeme príkaz ifstream, v zátvorkách uvádzame buď názov súboru, alebo cestu k súboru, ako som to urobil ja. („C: \\\ FromC \\ myfile.txt“);
Keď sme otvorili súbor, aby sme si z neho niečo prečítali, deklarovali sme jednu premennú like char -
char s1
Teraz už len musíme priradiť hodnotu reťazca zo súboru do premennej. Robíme to ako tím v
Venujte pozornosť uhlovým zátvorkám v >>
V skutočnosti, ako by malo byť zrejmé z komentárov k programovému kódu, aby premenná priradila čítanú hodnotu, musíme ju zapísať za v >>
v >> s1;

Zdá sa, že to nie je obzvlášť náročná úloha, najmä ak ste už dokonale zvládli a naučili sa používať materiál z predchádzajúceho článku - všetko je úplne rovnaké, líšia sa iba 2 príkazy

Vytvorenie súboru a zápis informácií do neho C++

ofstream von ( Názov súboru );
von<< (Písaný reťazec);
von.Zavrieť ();
=============================

Čítanie textu zo súboru a zobrazovanie textu na obrazovke v C++

ifstream v (Názov súboru );
v>> (Čítame riadok);
v.Zavrieť ();(Zavrieť súbor)
============================
Napíšme jednoduchý program, ktorý prečíta textový vstup z klávesnice a zapíše ho do súboru:

#include
#include

int main ()
{
\\ 3 budúce riadky
clrscsr (); //Čistenie obrazovky

cout<<“Wwedi pervuu stroku” ; cin >> a; endl;
cout<<“Wwedi wtoruu stroku” ; cin >> b; endl;
cout<<“Wwedi tretuu stroku” ; cin >> c; endl;
clrscr (); //

/ * Začnime pracovať so súborom * /
ofstream out („C: \\\ FromC \\ myfile.txt“); //Otvorenie súboru na zápis
von<Zapíšeme prvý riadok
von<Zapíšeme druhý riadok
von<Zapíšeme si tretí riadok
von .zavrieť (); // Zatvorte súbor

// Nastaví premenné na nulu

pre (int i = 0; i<=255 ;i ++)
(a = * „“; b = * „“; c = * „“;)


ifstream v („C: \\\ FromC \\ myfile.txt“);
v >> a >> b >> c; //Čítame každý nový riadok do novej premennej
v .zavrieť (); // Zatvorte súbor

/* */

pre (i = 0; a! = * „“; i ++)
{
ak (i> veľkosť (a)) prestávka;
cout<

}
cout<<“\n” ; \\

/* */


{
ak (i> veľkosť (b)) prestávka;
cout<
}
cout<<“\n” ; \\ Presuňte kurzor na nový riadok

/* */

pre (i = 0; с! = * „“; i ++)
{
ak (i> veľkosť (c)) prestávka;
cout<<с ;
}

návrat 0;
}
===================

Vo vyššie uvedených príkladoch je jeden taký OBROVSKÝ chyba. Ak sa pokúsime zadať riadok obsahujúci medzery, potom program nebude fungovať tak, ako potrebujeme. Pravdepodobne nielen ja, ale aj mnohí ďalší ľudia narazili na túto chybu. Preto nechávam nesprávne uvedený kód, aby ste videli, s čím sa môžete stretnúť.

Keďže doma knihy nie sú, opäť som začal prehľadávať internet a narazil som na množstvo všelijakých záludných nezmyslov. Napriek tomu som nejakým spôsobom našiel riešenie môjho problému.
Pomohlo mi, že som si to prečítal cout podporuje jeho metódy. A na internete všetky tipy smerujú k používaniu funkcie getline Našťastie som veľmi rýchlo našiel spôsob použitia tejto funkcie a následne som ju použil v kóde.
Vo všeobecnosti stojí za to spomenúť a opísať túto funkciu, ale zatiaľ jej nerozumiem, len chápem, že ju treba použiť a pochopiť ako, preto uvádzam správnejší príklad nášho vyvinutého programu:

#include
#include

int main ()
{
char a, b, c; \\ 3 budúce riadky
clrscsr (); //Čistenie obrazovky

/ * Zadajte hodnoty pre premenné * /

cout<<“Wwedi pervuu stroku” ; cin.getline (a, veľkosť (a)); endl;
cout<<“Wwedi wtoruu stroku” ; cin.getline (a, veľkosť (b)); endl;
cout<<“Wwedi tretuu stroku” ; cin.getline (a, veľkosť (c)); endl;
clrscr (); //Po zadaní hodnôt vymažte obrazovku

/ * Začnime pracovať so súborom * /
ofstream out („C: \\\ FromC \\ myfile.txt“); // Otvorenie súboru na zápis
von<
Zapíšeme prvý riadok
von<Zapíšeme druhý riadok
von<Zapíšeme si tretí riadok
von .zavrieť (); // Zatvorte súbor

// Nastaví premenné na nulu

pre (int i = 0; i<=255 ;i ++)
(a = * „“; b = * „“; c = * „“;)

/ * Pokračujeme v práci so súborom * /

ak stream v („C: \\\ FromC \\ myfile.txt“);
in.getline (a, veľkosť (a));// a
in.getline (b, veľkosť (b));// Čítame riadok do premennej b
in.getline (c, veľkosť (c)); // Čítame riadok do premennej c
v .zavrieť (); // Zatvorte súbor

/* Prvý riadok prečítame znak po znaku a zobrazíme ho na obrazovke */

pre (i = 0; a! = * „“; i ++)
{
ak (i> veľkosť (a)) prestávka;
cout<

}
cout<<“\n” ; \\ Presuňte kurzor na nový riadok

/* Druhý riadok prečítame znak po znaku a zobrazíme ho na obrazovke */

pre (i = 0; b! = * „“; i ++)
{
ak (i> veľkosť (b)) prestávka;
cout<
}
cout<<“\n” ; \\ Presuňte kurzor na nový riadok

/* Prečítame si tretí riadok znak po znaku a zobrazíme ho na obrazovke */

pre (i = 0; с! = * „“; i ++)
{
ak (i> veľkosť (c)) prestávka;
cout<<с[i];
}

getch (); \\Čaká sa na stlačenie klávesu Enter
návrat 0;
}
===================

V tomto materiáli je analyzovaný príklad čítania informácií po znakoch. Keďže som nepopísal, ako pracovať s premennými ako char, potom môžu začiatočníci zaznamenať určité nepríjemnosti pri vnímaní kódu. Len som nevedel aky typ char má nejaké zvláštnosti a myslel si, že všetko je jednoduchšie. Preto niektoré nepochopiteľné body vyššie uvedeného programu si môžete prečítať v ďalšom článku. práca s char v C++ pre začiatočníkov

Pokiaľ ide o zvyšok, uvedený príklad, ako čítať riadky z textového súboru v C ++, by mal byť dostupný a celkom zrozumiteľný. Toto teraz nie je optimálna možnosť implementácie a ušlo mi niekoľko dôležitých bodov, ale keďže sa začíname učiť jazyk C ++, nateraz to stačí. Neskôr sa pravdepodobne dostanem do bodu, ktorý som prehliadol, ale teraz potrebujem prijať len to podstatné.

Ak sme spolu s Vami pochopili tento materiál, znamená to, že sme urobili malý krok k našej profesionalite.

Poznámka:
prestávka;- Toto je príkaz, ktorý ukončí cyklus. Máme počítadlo cyklov pre bude väčšia ako deklarovaná veľkosť premennej char, potom násilne opustíme slučku
!= – toto je naša podmienka. Tento stav je označený nerovnosťou
ak (a! = b)- Číta ako keby a nerovná sa b

endl; - Toto presúva kurzor na nový riadok v konzole (pokiaľ som pochopil)
Tento príkaz je podobný ako "\ N"

Posledná aktualizácia: 31.10.2015

Trieda FileStream predstavuje schopnosť čítať zo súboru a zapisovať do súboru. Umožňuje vám pracovať s textovými súbormi aj binárnymi súbormi.

Pozrime sa na jeho najdôležitejšie vlastnosti a metódy:

    Vlastnosť Length: vracia dĺžku toku v bajtoch

    Vlastnosť pozície: vráti aktuálnu pozíciu v streame

    Metóda čítania: Číta údaje zo súboru do bajtového poľa. Preberá tri parametre: int Read (bajtové pole, int offset, int count) a vráti počet bajtov úspešne načítaných. Tu sa používajú nasledujúce parametre:

    • pole - pole bajtov, do ktorého budú umiestnené dáta načítané zo súboru

      offset predstavuje posun v bajtoch, do ktorého budú umiestnené načítané bajty

      počet je maximálny počet bajtov na čítanie. Ak súbor obsahuje menej bajtov, prečítajú sa všetky.

    Metóda dlhé vyhľadávanie (dlhý posun, pôvod SeekOrigin): nastavuje pozíciu v toku, posunutú o počet bajtov zadaný v parametri offset.

    Metóda zápisu: Zapíše údaje z bajtového poľa do súboru. Preberá tri parametre: Zápis (bajtové pole, int offset, int count)

    • pole - pole bajtov, odkiaľ sa budú dáta zapisovať do súboru

      offset - posun v bajtoch v poli, odkiaľ začať zapisovať bajty do streamu

      počet – maximálny počet bajtov na zápis

FileStream predstavuje prístup k súboru na úrovni bajtov, takže ak napríklad potrebujete prečítať alebo zapísať jeden alebo viac riadkov do textového súboru, bajtové pole sa musí skonvertovať na reťazce pomocou špeciálnych metód. Preto sa na prácu s textovými súbormi používajú iné triedy.

Zároveň pri práci s rôznymi binárnymi súbormi, ktoré majú špecifickú štruktúru, môže byť FileStream veľmi užitočný na získanie určitých informácií a ich spracovanie.

Pozrime sa na príklad čítania a zápisu do textového súboru:

Console.WriteLine ("Zadajte riadok na zápis do súboru:"); string text = Console.ReadLine (); // zápis do súboru pomocou (FileStream fstream = new FileStream (@ "C: \ SomeDir \ noname \ note.txt", FileMode.OpenOrCreate)) (// prevod reťazca na pole bajtov bajtov = System.Text.Encoding.Default . GetBytes (text); // zápis bajtového poľa do súboru fstream.Write (pole, 0, array.Length); Console.WriteLine ("Text zapísaný do súboru");) // čítanie zo súboru pomocou ( FileStream fstream = Súbor. OpenRead (@ "C: \ SomeDir \ noname \ note.txt")) (// prevod reťazca na bajtové bajtové pole = nový bajt; // čítanie údajov fstream.Read (pole, 0, pole .Length); // dekódovanie bajtov na reťazec textFromFile = System.Text.Encoding.Default.GetString (pole); Console.WriteLine ("Text zo súboru: (0)", textFromFile);) Console.ReadLine ();

Pozrime sa na tento príklad. Čítanie aj písanie používajú príkaz using. Toto vyhlásenie by sa nemalo zamieňať s príkazom using, ktorý obsahuje priestory názvov na začiatku súboru kódu. Príkaz using vám umožňuje vytvoriť objekt v bloku kódu, po dokončení ktorého sa zavolá metóda Dispose tohto objektu, a tým sa objekt zničí. V tomto prípade slúži ako takýto objekt premenná fstream.

Objekt fstream je vytvorený dvoma rôznymi spôsobmi: prostredníctvom konštruktora a prostredníctvom jednej zo statických metód triedy File.

Tu sa konštruktorovi odovzdajú dva parametre: cesta k súboru a enumerácia FileMode. Táto enumerácia označuje režim prístupu k súboru a môže nadobúdať nasledujúce hodnoty:

    Pripojiť: Ak súbor existuje, text sa pripojí na koniec súboru. Ak súbor neexistuje, vytvorí sa. Súbor sa otvorí iba na zápis.

    Vytvoriť: vytvorí sa nový súbor. Ak takýto súbor už existuje, potom sa prepíše.

    CreateNew: Vytvorí sa nový súbor. Ak takýto súbor už existuje, aplikácia vyvolá chybu

    Otvoriť: otvorí súbor. Ak súbor neexistuje, vyvolá sa výnimka

    OpenOrCreate: ak súbor existuje, otvorí sa, ak nie, vytvorí sa nový

    Skrátiť: Ak súbor existuje, bude prepísaný. Súbor sa otvorí iba na zápis.

Statická metóda OpenRead triedy File otvorí súbor na čítanie a vráti objekt FileStream.

Konštruktor FileStream má tiež množstvo preťažení, ktoré vám umožňujú jemnejšie vyladiť objekt, ktorý vytvára. Všetky tieto verzie si môžete pozrieť na msdn.

Zápis aj čítanie používajú objekt kódovania Encoding.Default z menného priestoru System.Text. V tomto prípade používame dve jeho metódy: GetBytes na získanie bajtového poľa z reťazca a GetString na získanie reťazca z bajtového poľa.

V dôsledku toho sa riadok, ktorý sme zadali, zapíše do súboru note.txt... V skutočnosti ide o binárny súbor (nie textový), hoci ak doň napíšeme iba riadok, budeme si môcť tento súbor zobraziť v čitateľnej forme otvorením v textovom editore. Ak však do nej zapíšeme náhodné bajty, napr.

Fstream.WriteByte (13); fstream.WriteByte (103);

Môžeme mať problém to pochopiť. Preto sú samostatné triedy určené na priamu prácu s textovými súbormi – StreamReader a StreamWriter.

Náhodný prístup k súborom

Nie je nezvyčajné, že binárne súbory predstavujú špecifickú štruktúru. A ak poznáme túto štruktúru, môžeme zo súboru zobrať potrebné informácie alebo naopak zapísať určitú množinu bajtov na určité miesto v súbore. Napríklad v súboroch wav samotné zvukové údaje začínajú 44 bajtmi a až 44 bajtov sú rôzne metadáta - počet zvukových kanálov, vzorkovacia frekvencia atď.

Pomocou metódy Seek () môžeme ovládať polohu kurzora prúdu, od ktorého sa súbor číta alebo zapisuje. Táto metóda má dva parametre: offset a pozíciu v súbore. Pozícia v súbore je opísaná tromi hodnotami:

    SeekOrigin.Begin: začiatok súboru

    SeekOrigin.End: koniec súboru

    SeekOrigin.Current: aktuálna pozícia v súbore

Kurzor prúdu, z ktorého sa má čítať alebo zapisovať, sa posunie dopredu o posun od pozície špecifikovanej ako druhý parameter. Posun môže byť záporný, potom sa kurzor presunie dozadu, ak je kladný, potom dopredu.

Vezmime si príklad:

Pomocou System.IO; pomocou System.Text; class Program (static void Main (string args) (text string = "hello world"; // zápis do súboru pomocou (FileStream fstream = new FileStream (@ "D: \ note.dat", FileMode.OpenOrCreate)) (// previesť reťazec na bajty byte input = Encoding.Default.GetBytes (text); // zápis bajtového poľa do súboru fstream.Write (vstup, 0, input.Length); Console.WriteLine („Text bol zapísaný do file"); // presuňte ukazovateľ na koniec súboru, päť bajtov na koniec súboru fstream.Seek (-5, SeekOrigin.End); // mínus 5 znakov od konca toku // čítanie štyri znaky z aktuálnej pozície výstup bajtu = nový bajt; fstream.Read ( výstup, 0, výstup.Length); // dekódovanie bajtov na reťazec textFromFile = Encoding.Default.GetString (výstup); Console.WriteLine (" Text zo súboru: (0)", textFromFile); // worl // nahraďte v súbore slovo world za reťazec slova dom nahradiťText = "dom"; fstream.Seek (-5, SeekOrigin.End); // mínus 5 znakov od konca vstupu streamu = Encoding.Default.GetBytes (replaceText); fstream.Write (vstup t, 0, vstupná dĺžka); // prečítať celý súbor // vrátiť ukazovateľ na začiatok súboru fstream.Seek (0, SeekOrigin.Begin); výstup = nový bajt; fstream.Read (výstup, 0, výstup. Dĺžka); // dekódovanie bajtov na reťazec textFromFile = Encoding.Default.GetString (výstup); Console.WriteLine ("Text zo súboru: (0)", textFromFile); // ahoj dom) Console.Read (); ))

Výstup na konzolu:

Text zapísaný do súboru Text zo súboru: worl Text zo súboru: hello house

Volaním fstream.Seek (-5, SeekOrigin.End) sa kurzor streamu presunie späť na koniec súboru o päť znakov:

To znamená, že po zapísaní riadku „hello world“ do nového súboru bude kurzor na pozícii znaku „w“.

Potom čítame štyri bajty začínajúce znakom "w". V tomto kódovaní bude 1 znak predstavovať 1 bajt. Preto čítanie 4 bajtov bude ekvivalentné čítaniu štyroch symbolov: "svet".

Potom sa opäť presunieme na koniec súboru, pričom nedosiahneme koniec piatich znakov (teda opäť z pozície znaku „w“) a napíšeme reťazec „dom“. Reťazec „dom“ teda nahrádza reťazec „svet“.

Zatvorenie streamu

Vo vyššie uvedených príkladoch sa na uzavretie prúdu používa konštrukt using. Po dokončení všetkých príkazov a výrazov v bloku using sa objekt FileStream zničí. Môžeme si však vybrať aj iný spôsob:

FileStream fstream = null; skúste (fstream = nový FileStream (@ "D: \ note3.dat", FileMode.OpenOrCreate); // operácie streamovania) catch (Exception ex) () nakoniec (if (fstream! = null) fstream.Close (); )

Ak nepoužijeme konštrukt using, potom musíme explicitne zavolať metódu Close (): fstream.Close ()

Textové súbory

Uvažujme o práci s textovým súborom v C pomocou príkladu. Vytvorte textový súbor na disku C s názvom TextFile.txt. Do tohto súboru zadajte nasledujúce riadky:

Reťazec_1 123 Reťazec_11, 456
Reťazec_2
Reťazec_3

Uložte súbor.

A toto je kód pre program v jazyku C, ktorý otvorí náš súbor a prečíta z neho riadky:

/ * * Autor: @author Subbotin B.P..h> #include #define LEN 50 int main (void) (vloží ("Operácie s textovým súborom"); char cArray; FILE * pTextFile = fopen ("C: \\ TextFile.txt", "r"); if (pTextFile == NULL) (uloží ("Problems"); return EXIT_FAILURE;) while (fgets (cArray, LEN, pTextFile)! = NULL) (printf ("% s", cArray);) fclose (pTextFile); return EXIT_SUCCESS;)

Ak chcete otvoriť textový súbor v C, použite funkciu fopen:

FILE * pTextFile = fopen ("C: \\ TextFile.txt", "r");

prvý argument pre fopen ukazuje na súbor a druhý hovorí, že súbor je otvorený na čítanie z neho.

Riadky čítame pomocou funkcie fgets:

fgets (cArray, LEN, pTextFile);

prvý argument fgets ukazuje na pole znakov, ktoré bude uchovávať výsledné reťazce, druhý argument je maximálny počet znakov na čítanie a tretí je náš súbor.

Po dokončení práce so súborom musí byť zatvorený:

fclose (pTextFile);

Dostaneme:

Ruské písmená v riadkoch tiež prechádzajú.

Mimochodom, tento program som vytvoril v Eclipse. Môžete vidieť, ako pracovať s C / C ++ v Eclipse.

Takže sme otvorili a prečítali údaje z textového súboru.

Teraz sa naučíme, ako programovo vytvárať textový súbor a zapisovať doň dáta.

/ * Autor: @author Subbotin B.P..h> #include int main (void) (FILE * pTextFile = fopen ("C: \\ TextFileW.txt", "w"); char * cString = "Toto je reťazec"; char cNewLine = "\ n"; int nVal = 123 ; if (pTextFile == NULL) (vloží ("Problémy"); return EXIT_FAILURE;) fprintf (pTextFile, "% s% c", cString, cNewLine); fprintf (pTextFile, "% d", nVal); return EXIT_SUCCESS ;)

Vytvorte textový súbor, do ktorého budete zapisovať údaje:

FILE * pTextFile = fopen ("C: \\ TextFileW.txt", "w");

ak súbor už existuje, otvorí sa a všetky údaje z neho sa vymažú.

C-reťazec cString a číslo nVal program zapíše do textového súboru. cNewLine je len zalomenie riadku.

Údaje zapisujeme do textového súboru pomocou funkcie fprintf:

fprintf (pTextFile, "% s% c", cString, cNewLine);

prvý argument je tu náš súbor, druhý je formátovací reťazec, tretí a ďalšie je počet argumentov požadovaných pre tento formát.

Práca s textovými súbormi v C++.

Existujú dva hlavné typy súborov: textové a binárne. Súbory umožňujú používateľovi čítať veľké množstvo údajov priamo z disku bez toho, aby ich zadával z klávesnice.

    Text nazývajú sa súbory pozostávajúce z ľubovoľných znakov. Sú usporiadané do riadkov, z ktorých každý končí znakom konca riadku. Samotný koniec súboru je označený symbolom "koniec súboru". Pri zapisovaní informácií do textového súboru, ktorý je možné zobraziť pomocou ľubovoľného textového editora, sa všetky údaje skonvertujú na typ znaku a uložia sa vo forme znakov.

    V binárne súbory sa informácie čítajú a zapisujú vo forme blokov určitej veľkosti, do ktorých možno ukladať dáta akéhokoľvek typu a štruktúry.

Na prácu so súbormi, špeciálne dátové typy volal tokov... Prietok ifstream slúži na prácu so súbormi v režime čítania a ofstream v režime nahrávania. Ak chcete pracovať so súbormi v režime zápisu aj čítania, použite stream fstream.

V programoch C ++ musíte pri práci s textovými súbormi zahrnúť knižnice iostream a fstream.

Komu zapísaťúdaje do textového súboru, musíte:

    opísať premennú typu stream.

    výstup informácií do súboru.

    nezabudnite súbor zavrieť.

Pre odpočtyúdaje z textového súboru, musíte:

    opísať premennú typu ifstream.

    otvorte súbor pomocou funkcie otvorenia.

    zatvorte súbor.

Nahrávanie informácie v textovom súbore

    Ako už bolo spomenuté, ak chcete začať pracovať s textovým súborom, musíte deklarovať premennú typu ofstream. Napríklad takto:

    Vytvorí sa premenná F na zápis informácií do súboru.

    Ďalším krokom je otvorenie súboru na zápis. Vo všeobecnosti bude operátor otvárania streamu vyzerať takto:

F.open ("súbor", režim);

Tu je F premenná, opísaná ako ofstream,

súbor - úplný názov súboru na disku,

režim - režim operácie s otváraným súborom.

Upozorňujeme, že pri zadávaní celého názvu súboru musíte použiť dvojitú lomku. Napríklad celý názov súboru noobs.txt, ktorý sa nachádza v priečinku hry na disku D:, bude potrebné zapísať takto:

D: \\ hra \\ noobs.txt.

Súbor je možné otvoriť v jednom z nasledujúcich režimov:

ios :: in - otvorenie súboru v režime čítania údajov, tento režim je predvolený režim pre streamy ifstream;

ios :: out - otvorenie súboru v režime záznamu údajov (informácie o existujúcom súbore sú zničené), tento režim je predvolený režim pre toky offstream;

ios :: app - otvorenie súboru v režime zápisu údajov na koniec súboru;

ios :: ate - presunie sa na koniec už otvoreného súboru;

ios :: trunc - vymaže súbor, to isté sa stane v režime ios :: out;

ios :: nocreate - neotvárať súbor, ak neexistuje;

ios :: noreplace - neotvárajte existujúci súbor.

Parameter mode môže chýbať, v tomto prípade sa súbor otvorí v predvolenom režime pre tento stream.

Po úspešnom otvorení súboru (v akomkoľvek režime) bude premenná F ukladať true, inak false. Tým sa skontroluje správnosť operácie otvorenia súboru.

Súbor môžete otvoriť (ako príklad si vezmite súbor D: \\ game \\ noobs.txt) v režime nahrávania jedným z nasledujúcich spôsobov:

// najprv spôsobom

z prúdu F;

F.open ("D: \\ hra \\ noobs.txt", ios :: out);

// druhý spôsob, ios :: výstupný režim je predvolený

// pre prúdiťofstream

z prúdu F;

// tretí spôsob kombinuje popis premennej a typu stream

// a otvorte súbor v jednom príkaze

ofstream F ("D: \\ hra \\ noobs.txt", ios :: out);

Po otvorení súboru v režime zápisu sa vytvorí prázdny súbor, do ktorého bude možné zapisovať informácie.

Ak chcete otvoriť existujúci súbor v režime predbežného zápisu, použite ako režim hodnotu aplikácie ios ::.

Po otvorení súboru v režime zápisu doň môžete zapisovať rovnakým spôsobom ako na obrazovku, len namiesto štandardného výstupného zariadeniacoutmusíte zadať názov otvoreného súboru.

Napríklad na zápis premennej a do streamu F bude výstupný operátor vyzerať takto:

Pre sekvenčný výstup do prúdu G premenných b, c, d sa výstupný operátor stane:

G<

Stream sa uzavrie pomocou operátora:

PRÍKLAD:

Vytvorte textový súbor D: \\ hra \\ noobs.txt a napíšte doň n reálnych čísel.

#include "stdafx.h"

#include

#include

#include

pomocou menného priestoru std;

int main ()

setlocale (LC_ALL, "RUS");

int i, n;

dvojité a;

// popisuje prúd na zapisovanie údajov do súboru

ofstream f;

// otvorenie súboru v režime zápisu,

//režimios:: vonpredvolene nainštalovaný

f.open ("D: \\ hra \\ noobs.txt", ios :: out);

// zadajte počet reálnych čísel

cout<<" n="; cin>> n;

// slučka na zadávanie reálnych čísel

// a zapíšte ich do súboru

pre (i = 0; i

cout<<"a=";

// zadajte číslo

cin >> a;

f<

// zatvorte stream

f.zavrieť ();

systém ("pauza");

návrat 0;

_______________________________________________________________

Aby ste mohli čítať informácie z textového súboru, musíte deklarovať premennú typu ifstream... Potom musíte súbor otvoriť na čítanie pomocou operátora otvorené... Ak sa premenná nazýva F, prvé dva operátory budú vyzerať takto:

F.open ("D: \\ hra \\ noobs.txt", ios :: in);

Po otvorení súboru v režime čítania z neho môžete čítať informácie rovnakým spôsobom ako z klávesnice, len namiesto tohocinzadajte názov toku, z ktorého sa budú údaje čítať.

Napríklad na čítanie z prúdu F do premennej a by vstupný príkaz vyzeral takto:

Dve čísla v textovom editore sa považujú za oddelené, ak je medzi nimi aspoň jeden zo znakov: medzera, tabuľka, znak konca riadka. Je dobré, ak programátor vopred vie, koľko a akých hodnôt je uložených v textovom súbore. Typ hodnôt uložených v súbore je však často jednoducho známy a ich počet sa môže líšiť. Pri riešení tohto problému je potrebné čítať hodnoty zo súboru jednu po druhej a pred každým čítaním skontrolovať, či bol dosiahnutý koniec súboru. Na to existuje funkcia F. eof().

Tu je názov streamu F. Funkcia vracia boolovskú hodnotu: true alebo false, v závislosti od toho, či bol dosiahnutý koniec súboru. Preto môže byť slučka na čítanie obsahu celého súboru napísaná takto:

// zariadiť čítanie hodnôt zo súboru, spustiť

// cyklus sa preruší, keď sa dostaneme na koniec súboru,

// v tomto prípade F.eof () vráti true

zatiaľ čo (! F.eof ())

PRÍKLAD:

Reálne čísla sú uložené v textovom súbore D: \\ game \\ noobs.txt, zobrazte ich na obrazovke a vypočítajte ich počet.

#include "stdafx.h"

#include

#include

#include

#include

pomocou menného priestoru std;

int main ()

setlocale (LC_ALL, "RUS");

int n = 0;

plavák a;

fstream F;

// otvorenie súboru v režime čítania

F.open ("D: \\ hra \\ noobs.txt");

// ak bol súbor otvorený správne, tak

// slučka na čítanie hodnôt zo súboru; vykonávanie cyklu sa preruší,

// keď sa dostaneme na koniec súboru, v tomto prípade F.eof () vráti true.

zatiaľ čo (! F.eof ())

// načítanie ďalšej hodnoty z prúdu F do premennej a

F >> a;

// zobrazenie hodnoty premennej a na obrazovku

cout<

// zvýšenie počtu prečítaných čísel

// zatvorte stream

F.zavrieť ();

// zadajte na obrazovku počet prečítaných čísel

cout<<"n="<

// ak bol súbor otvorený nesprávne, tak výstup

// správy o absencii takéhoto súboru

inak cout<<" Файл не существует"<

systém ("pauza");

návrat 0;

C++. Manipulácia s binárnymi súbormi

Pri zápise informácií do binárneho súboru sa znaky a čísla zapisujú ako postupnosť bajtov.

Komu zapísať dáta do binárneho súboru, potrebujete:

    opíšte premennú súboru typu FAIL * pomocou príkazu FILE * filename;. Názov súboru je názov premennej, v ktorej bude uložený ukazovateľ súboru.

    zapisovať informácie do súboru pomocou funkcie fwrite

Komu čítať b údajov z binárneho súboru, musíte:

    opísať premennú typu FILE *

    otvoriť súbor s funkciou fopen

    zatvorte súbor pomocou funkcie fclose

Základné funkcie potrebné na prácu s binárnymi súbormi.

Pre objavov súbor, je určená funkcia fopen.

FILE * fopen (const * názov súboru, const char * režim)

Názov súboru je reťazec, ktorý ukladá celý názov súboru, ktorý sa má otvoriť, režim je reťazec, ktorý definuje režim práce so súborom; možné sú nasledujúce hodnoty:

"Rb" - otvorenie binárneho súboru v režime čítania;

"Wb" - vytvorte binárny súbor na zápis; ak existuje, potom sa jeho obsah vymaže;

"Ab" - vytvorte alebo otvorte binárny súbor na pridanie na koniec súboru;

"Rb +" - otvorenie existujúceho binárneho súboru v režime čítania a zápisu;

"Wb +" - otvorte binárny súbor v režime čítania / zápisu, existujúci súbor sa vymaže;

"Ab +" - otvorí sa alebo vytvorí binárny súbor na opravu existujúcich informácií a pridanie nových informácií na koniec súboru.

Funkcia vráti NULL v premennej súboru f, ak súbor nie je úspešne otvorený. Po otvorení súboru je dostupný jeho 0. bajt, ukazovateľ súboru je rovný 0, ktorej hodnota je pri čítaní alebo zápise posunutá o počet prečítaných (zapísaných) bajtov. Aktuálna hodnota ukazovateľa súboru je číslo bajtu, od ktorého bude prebiehať operácia čítania alebo zápisu.

Pre zatváranie súbor, je určená funkcia fclose

int fclose (FILE * názov súboru);

Pri úspešnom zatvorení súboru vráti 0 a v opačnom prípade NULL.

Funkcia odstránenia je pre mazanie súbory.

int remove (const char * názov súboru);

Táto funkcia odstráni súbor s názvom filenema z disku. Súbor, ktorý sa má odstrániť, musí byť zatvorený. Ak súbor nebolo možné odstrániť, funkcia vráti nenulovú hodnotu.

Pre premenovanie súbory, funkcia premenovania je určená:

int premenovanie (const char * oldfilename, const char * newfilename);

Prvý parameter je starý názov súboru, druhý je nový. Pri úspechu vráti 0.

Čítanie z binárneho súboru sa vykonáva pomocou funkcie fread:

fread (void * ptr, veľkosť, n, FILE * názov súboru);

Funkcia fread načíta n prvkov veľkosti z názvu súboru do poľa ptr. Funkcia vráti počet prečítaných položiek. Po načítaní zo súboru sa jeho ukazovateľ posunie o n * bajtov veľkosti.

Nahrávanie do binárneho súboru sa vykonáva pomocou funkcie fwrite:

fwrite (const void * ptr, veľkosť, n, FILE * názov súboru);

Funkcia fwrite zapíše n prvkov veľkosti do názvu súboru z poľa ptr. Funkcia vracia počet zapísaných prvkov. Po zapísaní informácií do súboru sa ukazovateľ posunie o n * bajtov.

Pre kontrola konca súboru existuje funkcia feof:

int feof (FILE * názov súboru);

Ak bol dosiahnutý koniec súboru, vráti nenulovú hodnotu.

PRÍKLAD:

Vytvorte binárny súbor D: \\ game \\ noobs.dat a napíšte doň celé číslo n a n reálnych čísel.

#include "stdafx.h"

#include

pomocou menného priestoru std;

int main ()

setlocale (LC_ALL, "RUS");

int n, i;

dvojité a;

// vytvorenie binárneho súboru v režime zápisu

f = fopen ("D: \\ hra \\ noobs.dat", "wb");

// vstup číslan

cout<<"n="; cin>> n;

fwrite (& n, sizeof (int), 1, f);

// slučka na zadanie n reálnych čísel

pre (i = 0; i

// zadanie nasledujúceho reálneho čísla

cout<<"a=";

cin >> a;

// zápis reálneho čísla do binárneho súboru

fwrite (& a, sizeof (double), 1, f);

// Zavrieť súbor

fclose (f);

systém ("pauza");

návrat 0;

PRÍKLAD:

Zobrazte obsah binárneho súboru D: \\ game \\ noobs.dat vytvoreného v predchádzajúcej úlohe

#include "stdafx.h"

#include

pomocou menného priestoru std;

int main ()

setlocale (LC_ALL, "RUS");

int n, i;

dvojité * a;

SÚBOR * f; // popis premennej súboru

// otvorenie existujúceho binárneho súboru v režime čítania

// prečíta zo súboru jedno celé číslo do premennej n

// zobrazenie n na obrazovke

cout<<"n="<

// alokácia pamäte pre pole n čísel

a = nový dvojitý [n];

// načítanie n reálnych čísel zo súboru do poľa a

// zobrazenie poľa na obrazovke

pre (i = 0; i

cout<

cout<

// Zavrieť súbor

fclose (f);

systém ("pauza");

návrat 0;

Binárny súbor- sekvenčná dátová štruktúra, po otvorení súboru je dostupný prvý bajt v ňom uložený. Môžete postupne zapisovať alebo čítať údaje zo súboru. Povedzme, že chcete spočítať pätnáste číslo a potom prvé. Pri sekvenčnom prístupe to možno vykonať nasledujúcim spôsobom:

int n, i;

dvojité a;

SÚBOR * f;

f = fopen ("D: \\ hra \\ noobs.dat", "rb");

pre (i = 0; i<15; i++)

fclose (f);

f = fopen ("D: \\ hra \\ noobs.dat", "rb");

fread (& a, sizeof (double), 1, f);

fclose (f);

Ako vidíte, čítanie čísel zo súboru týmto spôsobom a následné opätovné otvorenie súboru nie je najpohodlnejší spôsob. Na presunutie ukazovateľa súboru na daný bajt je oveľa pohodlnejšie použiť funkciu fseek.

int fseek (FILE * názov súboru, dlhý int offset, int pôvod);

Funkcia nastaví ukazovateľ na aktuálnu pozíciu súboru F podľa hodnoty počiatku a posunu. Parameter offset sa rovná počtu bajtov, o ktoré bude ukazovateľ súboru posunutý od pôvodu určeného parametrom origin. Parameter pôvodu musí byť jedna z nasledujúcich hodnôt posunu, ako je definované v hlavičke stdio.h:

SEEK_SET - od začiatku súboru;

SEEK_CUR - z aktuálnej pozície;

SEEK_END – od konca súboru.

Funkcia vráti nulu, ak je operácia úspešná, nenulovú hodnotu, ak sa vyskytne chyba pri vykonávaní posunu

Funkcia fseek v skutočnosti implementuje priamy prístup k akejkoľvek hodnote v súbore. Potrebujete len poznať umiestnenie (číslo bajtu) hodnoty v súbore. Pozrime sa na využitie priameho prístupu v binárnych súboroch na príklade riešenia nasledujúceho problému.

PRÍKLAD

V predtým vygenerovanom binárnom súbore D: \\ game \\ noobs.dat zameňte najväčšie a najmenšie reálne čísla.

Algoritmus na riešenie problému pozostáva z nasledujúcich etáp:

    čítanie skutočných zo súboru do poľa a.

    vyhľadajte v poli a maximálne (max) a minimálne (min) hodnoty a ich čísla (imax, imin).

    posuňte ukazovateľ súboru na maximálnu hodnotu a zapíšte min.

    posuňte ukazovateľ súboru na minimálnu hodnotu a zapíšte max.

Nižšie je uvedený text programu na riešenie problému s komentármi.

#include "stdafx.h"

#include

pomocou menného priestoru std;

int main ()

setlocale (LC_ALL, "RUS");

int n, i, imax, imin;

dvojité * a, max, min;

SÚBOR * f;

// otvorenie súboru v režime čítania a zápisu

f = fopen ("D: \\ hra \\ noobs.dat", "rb +");

// načítanie sumy zo súboru do premennej n

// reálne čísla v súbore

fread (& n, sizeof (int), 1, f);

cout<<"n="<

// pridelenie pamäte na ukladanie reálnych čísel,

// ktoré bude uložené v poli a

a = nový dvojitý [n];

// čítanie zo súboru do poľa a reálnych čísel

fread (a, sizeof (double), n, f);

// nájdenie maximálnych a minimálnych prvkov

// v poli a a ich indexoch

pre (imax = imin = 0, max = min = a, i = 1; i

if (a [i]> max)

max = a [i];

ak (a [i]

min = a [i];

// sťahovanie ukazovateľ Komu maximálne element

fseek (f, sizeof (int) + imax * sizeof (double), SEEK_SET);

// namiesto maximálneho prvku súboru zapíše min

fwrite (& min, sizeof (double), 1, f);

// sťahovanie ukazovateľ Komu minimálne element

fseek (f, sizeof (int) + imin * sizeof (double), SEEK_SET);

// zapíšte max namiesto minimálneho elementu súboru

fwrite (& max, sizeof (double), 1, f);

// zatvorte súbor

fclose (f);

// uvoľnenie pamäte

vymazať [ ] a;

systém ("pauza");

Funkcia fopen () otvorí prúd na použitie, priradí súbor k danému prúdu a potom vráti ukazovateľ FILE na daný prúd. Najčastejšie sa súbor považuje za súbor na disku. Funkcia fopen () má nasledujúci prototyp:

FILE * fopen (const char * názov súboru, const char * režim);

Kde režim označuje reťazec obsahujúci požadovaný režim otvárania súboru. Platné hodnoty pre režim v Borland C++ sú uvedené v tabuľke. názov súboru musí byť reťazec znakov, ktorý poskytuje platný názov súboru pre operačný systém a môže obsahovať cestu.

Funkcia fopen () vracia ukazovateľ základného typu FILE. Tento ukazovateľ identifikuje súbor a používa ho väčšina funkcií v systéme súborov. Sami by ste to nikdy nemali meniť. Ak sa súbor nedá otvoriť, funkcia vráti nulový ukazovateľ.

Ako ukazuje tabuľka, súbor je možné otvoriť v textovom alebo binárnom režime. V textovom režime sa pri písaní preloží návrat vozíka a postupnosť posunu riadka na znak nového riadku. Vo výstupe je opak pravdou: znak nového riadku sa preloží na návrat vozíka a posun riadku. V binárnych súboroch sa takýto preklad nevyskytuje. Ak v argumente mode nie je zadané ani t ani b, stav textového/binárneho súboru je určený hodnotou globálnej premennej _fmode definovanej v Borland C++. Štandardne je fmode nastavený na O_TEXT, to znamená, že je nastavený textový režim. Ak nastavíte _fmode na O_BINARY, súbory sa otvoria v binárnom režime. (Tieto makrá sú definované v fcntl.h.) Prirodzene, použitie explicitného t alebo b odstráni efekty spojené s premennou _fmode. Tiež _fmode je špecifický pre produkty Borland. Nie je definovaný v ANSI C I / O.

Ak potrebujete otvoriť súbor s názvom test na zápis, mali by ste napísať:

Fp = fopen ("test", "w");

Kde fp je premenná typu FILE *. Zvyčajne však môžete vidieť nasledovné:

Ak ((fp = fopen ("test", "w")) == NULL) (
vloží ("Súbor sa nedá otvoriť.");
výstup (1);
}

Táto metóda vám umožňuje odhaliť chyby pri otváraní súboru, napríklad prítomnosť ochrany proti zápisu alebo nedostatok voľného miesta na disku.

Ak sa na otvorenie súboru na zápis použije fopen (), odstráni sa akýkoľvek už existujúci súbor so zadaným názvom. Ak súbor so zadaným názvom neexistuje, vytvorí sa.

Ak potrebujete pridať informácie na koniec súboru, mali by ste použiť režim a (pripojiť). Ak súbor neexistuje, vytvorí sa.

Otvorenie súboru na čítanie vyžaduje, aby súbor existoval. Ak súbor neexistuje, vráti sa chyba. Ak je súbor otvorený na operáciu čítania/zápisu, neodstráni sa, ak existuje, a ak súbor neexistuje, vytvorí sa.

Tabuľka: Hodnoty povoleného režimu

Význam

Otvorí súbor na čítanie. (Štandardne sa otvorí ako textový súbor.)

Vytvorí súbor na zápis. (Štandardne sa otvorí ako textový súbor.)

Pripojí sa k súboru. (Štandardne sa otvorí ako textový súbor.)

Otvorí binárny súbor na čítanie.

Otvorí binárny súbor na zápis.

Pripojiť k binárnemu súboru.

Otvorí súbor na čítanie/zápis. (Štandardne sa otvorí ako textový súbor.)

Vytvorí súbor na čítanie/zápis. (Štandardne sa otvorí ako textový súbor.)

Pripojí alebo vytvorí súbor na čítanie/zápis. (Štandardne sa otvorí ako textový súbor.)

Otvorí binárny súbor na čítanie/zápis.

Vytvorí binárny súbor na čítanie/zápis.

Pripojí alebo vytvorí binárny súbor na čítanie/zápis.

Vytvorí textový súbor na písanie.

Pripája sa k textovému súboru.

Otvorí textový súbor na čítanie.

Vytvorí textový súbor na čítanie/zápis.

Otvorí alebo vytvorí textový súbor na čítanie/zápis.




Stránky pomocníka pre počítače

© Copyright 2021,
rzdoro.ru – stránka počítačovej pomoci

  • Kategórie
  • železo
  • Windows 10
  • Skenovanie
  • Windows 7
  • železo
  • Windows 10
  • Skenovanie
  • Windows 7